我試圖設置一個PHP頁面,它將安全地接受文件上傳(簡歷),將其作爲一個mysql blob存儲,並在稍後提供下載。但是當我稍後下載PDF文件進行查看時,他們總是看起來損壞,無法正常打開。PHP:base64_encode是否防止mysql注入?
多虧了Jgoettsch(php: reversing mysql_real_escape_string's effects on binary)的問題時,我意識到,通過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();
}
?>
這裏是我的問題:
- I如果你有一個文件上傳字段,那該字段容易受到sql注入的影響嗎?還是我不必要地擔心?顯然這個文件上傳任務將會簡單得多,如果我可以在沒有任何翻譯的情況下將二進制文件傳遞到blob字段。
- 如果我通過base64_encode()提供上傳的文件內容,是否等同於消毒?或者我應該編碼它,然後通過mysql_real_escape_string另外傳遞編碼的字符串?
- 這一切似乎只是一個很大的努力,只是爲了存儲和獲取PDF。有沒有更簡單的解決方案來解決這個共同的需求,我還沒有找到呢?
在此先感謝!
答案:** NO ** –
使用mysqli或PDO與準備的查詢和佔位符,應該解決編碼和注入問題。 – Barmar
它的安全注射方式不會將叉子塞入電源插座,防止觸電。注入漏洞的規則:如果您在查詢中使用「外部」數據,那麼您很脆弱。數據來自哪裏並不重要,即使它來自YOURSELF。您仍然可以輕鬆地注入您自己的查詢。 –