2012-04-08 74 views
6

我工作在PHP上傳表單必須只允許將MP3文件。是MIME類型檢測最好的方法來檢測一種文件?

上傳完成後,我分析文件,以檢查它是否真的是一個MP3 ..第一步是檢測MIME類型爲「audio/mpeg」,我使用庫finfo_file()測試一些MP3被拒絕,因爲他們的MIME類型結果爲:應用/八位字節流

我的問題是: - 我的應用程序應該拒絕絕對那些MP3?他們實際上播放音頻 - 是否有任何理由爲什麼這種MIME類型是一個MP3? - MIME類型是檢測文件類型的最可靠方法嗎?

回答

0

如果你想檢測的文件類型,而不只是信任客戶提供正確的MIME類型一個非常強大的方式,在UNIX上使用file效用。

$ file Black\ Sands\ 01\ Prelude.mp3 
Black Sands 01 Prelude.mp3: Audio file with ID3 version 2.2.0, contains: MPEG ADTS, layer III, v1, 320 kbps, 44.1 kHz, Stereo 

$ file homework/math475-hw8.docx 
homework/math475-hw8.docx: Microsoft Word 2007+ 

在PHP中,您可以使用exec函數來調用它。

+0

這是一個選項,我沒有考慮..我無法測試,因爲我贏了 – enkore 2012-04-08 05:32:14

+0

有一個爲win32編譯的版本[這裏](http://gnuwin32.sourceforge.net/packages/ file.htm)。 – 2012-04-09 00:31:51

+0

'file'命令和PHP的'finfo_file'函數使用相同的方法來確定MIME類型(通常通過引用'/ usr/share/misc/magic')。當你有一個內置函數時,對'exec file'沒有用處。然而,我有一種情況,當我期望它返回'audio/mpeg'時,'finfo_file'和'file -I'都會檢測到'.mp3'作爲'application/octet-stream'。兩者都失敗了。不過,我認爲這可以通過將路徑傳遞給改進的'magic'文件作爲finfo_open的第二個參數來解決。 – 2015-09-17 18:33:37

0

文件檢測的最好的方法是使用「魔字節」或「幻數」方案中,除了MIME。 Unix的file(以及finfo_file)實際使用「魔術字節」做這個文件檢測。所以,簡而言之:是的。

不要太在乎你的文件看起來像,以及更多關於你可以用它做什麼。只要它起作用,文件應該沒問題。

如果你真的做多,你可以檢查魔術字節自己。有a list of them here

+0

這就是爲什麼與getid3()類我得到「音頻/ MPEG」,但與finfo_filei獲得「應用程序/八位字節流」在同一個文件上。 這有點奇怪.. 但即使該文件是可播放的,如果結果與不同的MIME類型,它會因爲安全原因而被拒絕(除非我找到更好的方法)..我想知道有多少MP3沒有正確的MIME .. – enkore 2012-04-08 05:31:21

+1

@enkore「我想知道有多少MP3沒有正確的MIME 「MIME類型由客戶端提供。這不是MP3文件本身固有的。 – 2012-04-09 00:33:10

2

在我需要上傳的大多數應用程序中,我有時會根據預定義的MIME類型列表來解決驗證瀏覽器(客戶端)傳遞的MIME的問題。這種方法使得一般的假設:如果可疑的東西是在哪裏瀏覽器是無法溝通的上傳MIME類型的文件中去,我可能不想理會在這個時候處理它。

<?php 

$valid_mp3_mimes = array(
    'audio/mpeg', 
    'audio/x-mpeg', 
    'audio/mp3', 
    'audio/x-mp3', 
    'audio/mpeg3', 
    'audio/x-mpeg3', 
    'audio/x-mpeg-3', 
    'audio/mpg', 
    'audio/x-mpg', 
    'audio/x-mpegaudio', 
    'video/mpeg', 
    'video/x-mpeg', 
); 

$uploaded_file_mime = $_FILES['upload_field_name']['type']; 

if(!in_array($uploaded_file_mime, $valid_mp3_mimes)) 
{ 
    die('Upload is not a valid MP3 file.'); 
} 

您可能會也可能不會覺得這是您的目的足夠的方法。 PHP手冊明確指出,如果瀏覽器提供了這個信息,並且在服務器端不檢查MIME類型,則此信息可用,因此不應被視爲理所當然。

需要考慮的一件事是服務器上的資源的可用性,它允許您驗證文件的真實MIME類型。作爲PHP開發人員,我們非常喜歡大部分創建平臺無關代碼的靈活性(例如,構建在運行XAMPP的Windows系統上的我們的Web應用程序可以通過很少的修改部署到Linux主機環境中)。但是,在驗證MIME類型時,我們開始引入平臺相關的方法,這些方法需要驗證這些工具的存在(如「file」或「finfo_file」)。

這可能是一個實現值得研究(從笨GitHub的倉庫取),利用這些工具,並即將爲徹底的工作示例作爲你將PHP的範圍內得到:

如果可能,文件MIME類型會檢測上載文件的(實際)MIME類型。 https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Upload.php#L983


來源

PHP手冊 POST方法上傳 - http://www.php.net/manual/en/features.file-upload.post-method.php

網站管理員工具包 MIME類型 - http://www.webmaster-toolkit.com/mime-types.shtml

FILExt .MP3文件 - http://filext.com/file-extension/MP3