ファイルのアップロード (再開) を安全に受け入れ、それを 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();
}
?>
ここに私の質問があります:
- ファイル アップロード フィールドがある場合、そのフィールドは SQL インジェクションに対して脆弱ですか? それとも私は不必要に心配していますか?明らかに、このファイル アップロード タスクは、バイナリを変換せずに blob フィールドに渡すことができれば、はるかに簡単になります。
- アップロードされたファイルの内容を base64_encode() でフィードした場合、それはサニタイズと同じですか? または、それをエンコードしてから、エンコードされた文字列を mysql_real_escape_string を介してさらに渡す必要がありますか?
- これは、PDF を保存して取得するだけでも大変な作業のように思えます。私がまだつまずいていない、この一般的なニーズに対するより簡単な解決策はありますか?
前もって感謝します!