2013-07-31 79 views
0

我試圖設置一個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(); 
} 
?> 

這裏是我的問題:

  1. I如果你有一個文件上傳字段,那該字段容易受到sql注入的影響嗎?還是我不必要地擔心?顯然這個文件上傳任務將會簡單得多,如果我可以在沒有任何翻譯的情況下將二進制文件傳遞到blob字段。
  2. 如果我通過base64_encode()提供上傳的文件內容,是否等同於消毒?或者我應該編碼它,然後通過mysql_real_escape_string另外傳遞編碼的字符串?
  3. 這一切似乎只是一個很大的努力,只是爲了存儲和獲取PDF。有沒有更簡單的解決方案來解決這個共同的需求,我還沒有找到呢?

在此先感謝!

+1

答案:** NO ** –

+2

使用mysqli或PDO與準備的查詢和佔位符,應該解決編碼和注入問題。 – Barmar

+2

它的安全注射方式不會將叉子塞入電源插座,防止觸電。注入漏洞的規則:如果您在查詢中使用「外部」數據,那麼您很脆弱。數據來自哪裏並不重要,即使它來自YOURSELF。您仍然可以輕鬆地注入您自己的查詢。 –

回答

1

問題如果您有一個文件上傳字段,該字段是否容易受到sql注入?

一個是(排序這並不是說很容易受到SQL注入的表單上的字段;該漏洞確實是在處理在請求中提交的值的代碼)

Q還是我不必要地擔心?

一個號您一定要了解潛在的壞事情發生,以防止漏洞被暴露的方式編寫代碼(和剝削。)

Q如果我通過base64_encode()提供上傳的文件內容,這等於是消毒嗎?

A只要你的base64_encode保證返回值只包含[A-Za-z0-9 +。/ =],它就快到了。最佳做法是使用綁定參數

Q或者我應該編碼它然後另外通過編碼的字符串通過mysql_real_escape_string?

一個禁止使用與綁定參數準備好的語句,那麼最好的做法規定所有值(包括Base64編碼的值)通過mysql_real_escape_string運行,如果被列入它們在SQL文本提交到數據庫。

1

既然你在談論消毒,我假設這是一個公共網站,陌生人將上傳文件。存儲用戶提交的PDF文件是很不好的想法。首先,你如何確定你收到的文件甚至是PDF文件?用戶有可能將100%的惡意文件壓入數據庫,並讓用戶在不知情的情況下下載病毒。 PDFs本身(如果我記得正確的話)實際上可能會妨礙在某些Windows操作系統中執行病毒,就像WMV和WMA文件一樣。

如果您絕對需要PDF,那麼最好的選擇是創建您自己的PDF文件與用戶提交的消毒數據。您可以在網上找到關於如何做到這一點的教程。我個人不會推薦首先使用PDF,因爲您可以使用HTML & CSS來構建簡歷並完美地打印出來。

+0

謝謝安德魯。 PDF將由公衆提交,短期內我看不到解決辦法。我們需要讓未來的實習生申請職位變得容易,並以他們可能掌握的最標準形式(.docx,.doc,.pdf)接受他們的簡歷。它不會與人力資源部合作,要求申請人將他們的簡歷複製並粘貼到CKeditor或類似的東西中。 –

+0

是的,我知道你想構建一個對用戶友好的Web應用程序,但是在處理文件時,它會變得非常困難。除了讓自己受到安全漏洞之外,我沒有看到短期的解決方案。通常,您不必擔心MYSQLi或PDO的注入,但真正的問題是下載這些文件的用戶。 – Andrew

+0

PDF文件通常不是*易受攻擊的。我不知道最新的Adobe Reader更新沒有修復任何漏洞。可能確實值得檢查的是文件實際上*是一個真正的PDF,但沒有必要完全放棄PDF上傳。 –