2011-06-23 24 views
7

好的,我允許(在一個腳本內)通過論壇管理員定義的方法上傳某些類型的文件!我如何知道這些文件是否屬於管理員設置的類型,以確保它們不是假文件。我目前正在使用MIME類型的方法,但不同的瀏覽器可以設置不同的MIME類型,所以這並沒有多大幫助。檢查文件擴展名也沒有幫助,因爲人們可以通過給它一個允許的擴展名來解決這個問題,但是它會是不同的文件類型。如何確定他們正在上傳某些文件

也許有一種方法來檢查許多不同類型的文件中的字節,以確保它是正確的類型的方式參考?也許這也可能是僞造的,但至少在使用表單上傳文件和提交文件時會更加準確。

有人可以幫助我的想法嗎?

謝謝:)

+0

你期望什麼類型的文件?根據文件,您可以閱讀它們的頭文件以查看它們是什麼類型的文件。 – alex

+0

那麼,管理員可以通過放置每個允許用逗號分隔的文件擴展名的擴展名來選擇他們想要允許上傳的文件。所以,現在我只需要'explode(',',$ extensions)',並確保文件類型對於返回的數組中的所有擴展都是正確的。有沒有辦法做到這一點?你可以讀什麼文件頭?哪些文件可以不讀取標題?你有沒有更好的方法來實現這個更好的安全性和/或代碼方面的想法? – SoLoGHoST

+0

看看['mime_content_type()'](http://php.net/manual/en/function.mime-content-type.php)。 – alex

回答

3

PECL fileinfo(或內置> 5.3)將檢查文件的字節簽名來猜測他們的MIME類型,因此它可以防止人們只需更改文件擴展名。在某些情況下,仍然可以在與文件類型的適當字節簽名匹配的文件中包含惡意字節。

從PHP文檔:

// Procedural style 
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension 
echo finfo_file($finfo, $filename); 
finfo_close($finfo); 

// OO style 
$finfo = new finfo(FILEINFO_MIME_TYPE); 
echo $finfo->file($filename); 
$finfo->close(); 

在Unix服務器上,我相信finfo_file()諮詢相同的字節簽名數據庫作爲GNU file效用。

+0

@Phoenix我認爲這是本週第三次您從我的PHP doc URL中刪除了i10n。我會記得自己從現在開始:) –

+0

謝謝邁克爾,會試試看。 – SoLoGHoST

0

千萬不要信任用戶輸入。永遠不要使用檢查給定的filetype/mimetype作爲防止用戶將惡意內容上傳到服務器的方式。如果目標是服務器安全,那麼如果用戶上傳內容,則不要在服務器上執行內容。對於其他用戶下載的文件,請務必聲明該內容是由用戶生成的,並且不保證無病毒。

相關問題