[英]How do I tell if someone's faking a filetype? (PHP)
我正在編寫一些東西,允許用戶在網絡服務器上存儲文檔和圖片,以便以后存儲和檢索。 當用戶將文件上傳到我的服務器時,PHP會根據擴展名告訴我它是什么文件類型。 但是,我擔心用戶可以將zip文件重命名為somezipfile.png並存儲它,從而在我的服務器上保留一個zip文件。 有沒有合理的方法來打開上傳的文件並“檢查”以查看它是否真的屬於所述文件類型?
幻數 。 如果你可以讀取二進制文件的前幾個字節,你就可以知道它是什么類型的文件。
查看PHP的FileInfo PECL擴展,它可以為您執行MIME魔術查找。
有點。 大多數文件類型都保留了一些字節用於標記它們,因此您不必依賴擴展名。 網站http://wotsit.org是一個很好的資源,可以找到特定類型的這個。
如果您使用的是unix系統,我相信file命令不依賴於擴展,因此如果您不想編寫字節檢查代碼,可以使用它。
對於PNG( http://www.w3.org/TR/PNG-Rationale.html )
PNG文件的前八個字節始終包含以下值:
(十進制)137 80 78 71 13 10 26 10
(十六進制)89 50 4e 47 0d 0a 1a 0a
(ASCII C表示法)\\ 211 PNG \\ r \\ n \\ 032 \\ n
許多文件類型在文件的開頭都有“ 魔術數字 ”來識別它們。您可以從文件的前面讀取一些字節,並將它們與已知幻數列表進行比較。
如果您只處理圖像,那么getimagesize()應該區分有效圖像和偽圖像。
$ php -r 'var_dump(getimagesize("b&n.jpg"));'
array(7) {
[0]=>
int(200)
[1]=>
int(200)
[2]=>
int(2)
[3]=>
string(24) "width="200" height="200""
["bits"]=>
int(8)
["channels"]=>
int(3)
["mime"]=>
string(10) "image/jpeg"
}
$ php -r 'var_dump(getimagesize("/etc/passwd"));'
bool(false)
來自getimagesize的錯誤值不是圖像。
在unix系統上,從'file'命令捕獲輸出應該提供足夠的信息。
有關如何在PHP中快速完成此操作的確切答案,請查看以下問題: 如何使用php查找文件的mime類型?
作為旁注,我遇到了類似的問題,我不得不進行自己的類型檢查。 我的應用程序的前端界面是在flash中完成的。 這些文件正在通過flash傳遞給php腳本。 當我嘗試使用php進行MIME類型檢查時,總是返回的類型是application / octetstream,因為它來自flash。
我必須實現一個神奇的數字類型范例。 我只是創建了一個xml文件,其中包含文件類型以及在文件開頭找到的一些定義模式。 一旦文件到達服務器,我做了一些與xml文件匹配的模式,然后接受或拒絕該文件。 我沒有注意到任何真正的性能下降,這是我期待的。
對於可能正在使用flash作為前端並嘗試在上傳文件后鍵入檢查的人,這只是一個附注。
除了識別文件類型之外,您可能還需要注意嵌入或附加了其他文件的文件。 遺憾的是,這需要對文件內容進行更深入的分析,而不僅僅是使用“魔術數字”。
例如, http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (這種特殊類型的數據隱藏可以通過加載和將實際圖像數據重新保存到新文件中......其他圖像將更加困難。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.