我有這個問題一段時間:一個文件的MIME類型究竟是如何確定的?我相信這是通過檢查文件的特定字節是否包含任何已知的magic numbers/file signatures來完成的,對嗎?Mimetypes在上傳中的可靠性(PHP)
如果是這樣,這帶來了另一個問題,可以說,我上傳一個bash腳本用假GIF文件簽名,以一個網站,只允許上傳的圖片,有什麼事情發生?或者:
- 的MIME類型檢測程序是足夠聰明來檢測仿冒簽名,或
image/gif
被錯誤地返回作爲MIME類型和允許上傳繼續
我沒有一個HEX編輯安裝了ATM,我不喜歡從測試中形成安全相關的結論,因爲我可能會錯過(或誤解)某些內容,所以我的問題是:上述哪一個選項是正確的?
此外,是否有任何其他的最佳實踐(除了檢查的MIME類型),以確保任何給定的文件實際上是什麼,似乎/需要(或允許)是?提前致謝。
PS:要說清楚的是,我並沒有詢問$_FILES
superglobal中的type
索引。
'$ _FILES'中的'type'索引來自瀏覽器/用戶,根本不可信。我正在使用Fileinfo(或相似的),但問題仍然適用:如果MIME是僞造的,Fileinfo是否足夠聰明以檢測? – 2011-05-14 06:59:26
就我從文檔中瞭解的內容而言,Fileinfo會查看標題,並執行一些啓發式操作來檢測文件類型,並且不需要(或依賴)瀏覽器發送的信息。 – 2011-05-14 07:26:10
PHP手冊中的fileinfo頁面顯示文件檢測不是100%可靠的。我會假設你可以製作一個可以欺騙它的文件。 – GordonM 2011-05-14 07:32:47