0

ファイルのアップロード (再開) を安全に受け入れ、それを mysql blob として保存し、後でダウンロードできるようにする PHP ページをセットアップしようとしています。しかし、後で表示するために PDF をダウンロードすると、常に破損しているように見え、正しく開くことができません。

Jgoettsch ( php: バイナリに対する mysql_real_escape_string の影響を逆転させる)による質問のおかげで、(インジェクションを防ぐために) mysql_real_escape_string を介してファイル データをフィードするとファイルの内容が破損する可能性があることに気付き、代わりに base64_encode() を介してバイナリを渡すというアイデアを得ました。ダウンロードする前に base64_decode() を使用します。

これは、私が現在行っていることを示すモックアップ コードです (これは機能していません)。

アップロード:

<? 
// Get file contents
$cv_pointer = fopen($_FILES['cv']['tmp_name'], 'r');
$cv_content = fread($cv_pointer, filesize($_FILES['cv']['tmp_name']));
fclose($cv_pointer);

// Insert SQL
$sql = sprintf("INSERT INTO documents (name, file, size, date_uploaded)
  VALUES ('%s', '%s', '%s', NOW())",
    mysql_real_escape_string($_FILES['cv']['name']),
    mysql_real_escape_string($cv_content),
    mysql_real_escape_string($_FILES['cv']['size']));
$result = mysql_query($sql);
?>

そしてダウンロード:

<? 
if (isset($_GET['view_cv'])) {
  $cv = mysql_fetch_assoc($rsApplicationCv);

  header("Content-length: ".$cv['size']); 
  header("Content-type: application/pdf"); 
  header("Content-disposition: attachment; filename=".$cv['name']);
  echo $cv['file'];
  exit();
}
?>

ここに私の質問があります:

  1. ファイル アップロード フィールドがある場合、そのフィールドは SQL インジェクションに対して脆弱ですか? それとも私は不必要に心配していますか?明らかに、このファイル アップロード タスクは、バイナリを変換せずに blob フィールドに渡すことができれば、はるかに簡単になります。
  2. アップロードされたファイルの内容を base64_encode() でフィードした場合、それはサニタイズと同じですか? または、それをエンコードしてから、エンコードされた文字列を mysql_real_escape_string を介してさらに渡す必要がありますか?
  3. これは、PDF を保存して取得するだけでも大変な作業のように思えます。私がまだつまずいていない、この一般的なニーズに対するより簡単な解決策はありますか?

前もって感謝します!

4

2 に答える 2

1

あなたはサニタイズについて話しているので、これは見知らぬ人がファイルをアップロードする公開Webサイト用であると思います. ユーザーが提出した PDF ファイルを保存することは、非常に悪い考えです。まず、受け取ったファイルが PDF であることをどのように確認できますか? ユーザーが悪意のあるファイルをデータベースに CURL で挿入し、知らないうちにウイルスをダウンロードさせる可能性は 100% あります。PDF 自体 (私の記憶が正しければ) は、WMV や WMA ファイルと同じように、特定の Windows オペレーティング システムで実際にウイルスを実行する方法を誤る可能性があります。

絶対に PDF が必要な場合は、代わりに、ユーザーが送信したサニタイズ済みデータを使用して独自の PDF ファイルを作成することをお勧めします。これを行う方法については、おそらくオンラインのチュートリアルを見つけることができます。個人的には、HTML と CSS を使用して履歴書を作成し、完全に印刷できるため、そもそも PDF を使用することはお勧めしません。

于 2013-07-31T18:33:06.610 に答える
1

Qファイル アップロード フィールドがある場合、そのフィールドは SQL インジェクションに対して脆弱ですか?

はい (一種。SQL インジェクションに対して脆弱なのはフォームのフィールドではありません。脆弱性は実際には、リクエストで送信された値を処理するコードにあります。)

Qそれとも、私は不必要に心配していますか?

Aいいえ。悪いことが起こる可能性を常に認識し、脆弱性が公開 (および悪用) されないようにコードを記述する必要があります。

Qアップロードしたファイルの内容を base64_encode() でフィードすると、サニタイズと同じですか?

A戻り値に [A-Za-z0-9+./=] のみが含まれることを base64_encode が保証している限り、ほぼ完了です。ベスト プラクティスは、バインド パラメータを使用することです。

Qまたはそれをエンコードしてから、エンコードされた文字列を mysql_real_escape_string に追加で渡す必要がありますか?

バインド パラメータを含む準備済みステートメントの使用を禁止すると、データベースに送信される SQL テキストに含まれるすべての値 (base64_encoded 値を含む) が mysql_real_escape_string を介して実行されることがベスト プラクティスとして規定されます。

于 2013-07-31T19:38:27.343 に答える