2010-07-09 87 views
5

我正在構建一個用戶可以上傳mp3文件的網站。而且,我想檢查該文件是否是mp3文件。我需要知道的是,如果有一個PHP函數可以幫助我。PHP真實文件類型

我試圖$_FILES['uploadedfile']['type']

但是,我不是那樣想的,因爲它返回一個基於擴展名的文件類型(我測試了它只能在Windows上)

所以,問題是:

  1. 有一種安全的方式來做到這一點與PHP本地功能?
  2. 基於擴展名的文件類型是PHP的問題還是與操作系統有關?
  3. 你對我有什麼建議?

謝謝。

+0

[如何檢查文件是圖像還是視頻類型在PHP版本5.2.9?](http://stackoverflow.com/questions/3074527/how-to-check-whether-file-is-image-or -video-type-in​​-php-version-5-2-9)對於getID3覆蓋了相同的理由 – Gordon 2010-07-09 21:11:45

回答

7

1-有一個安全的方法來做到這一點與PHP本地功能?

對於MP3,不支持PHP本機功能,不支持。

fileinfo,它利用操作系統的「MIME嗅探」功能。如果安裝,它通常很可靠。

或者,getID3庫聲稱能夠從MP3文件中提取信息。如果您可以從文件中獲得播放時間,則可能是有效的MP3文件。

2-基於擴展名的文件類型,是PHP的問題還是與操作系統有關?

都沒有。瀏覽器確定文件類型(通常根據擴展名)併發送MIME類型。與任何傳入數據一樣,假冒非常容易,永遠不可信任。

+1

+1。我之前使用它來檢查QuickTime影片是否包含流式提示。非常非常有用。 – 2010-07-09 20:30:33

1

你想看看MIME類型。 PHP的fileinfo擴展是執行此操作的首選方式。

1

上傳後打開文件,並檢查前幾個字節,看它是否與應該在mp3文件頭中匹配。

+0

前幾個字節也可以是ID3 – 2010-07-09 20:48:30

+0

我沒有說前幾個字節可能是什麼,所以我不知道這是如何適用於我的答案。你確定你不是認爲這是對其他回答之一的答覆嗎? – GrandmasterB 2010-07-09 20:55:13

3

MP3的問題有點模糊。 MP3文件通常在開始和/或結束處包含一堆無用的MP3幀。通常這是爲了保存ID3標籤,但由於其他原因(例如,幼稚的流切斷)遇到在末尾具有無意義數據的MP3並不罕見。

實際上幾乎所有的東西都可以是MP3,許多任意的二進制文件將有東西看起來像一個MP3幀。尋找ID3和長度信息(如Pekka的答案)是一個很好的啓發式方法,如果一個文件是可能是MP3,但是如果你想到的是安全相關的話,這是不夠的。

它返回一個基於擴展名的文件類型(我測試了它只能在Windows上)

實際上它返回的字符串類型用戶的Web瀏覽器發送它,它在Windows將被確定原始文件擴展名,但在Mac或Linux上可能來自其他來源。無論哪種方式,如文件名本身,它不被信任。用戶的計算機可能設置錯誤,或者可能故意爲文件發送錯誤的媒體類型字符串。

有一個安全的方法來做到這一點與PHP本地功能?

您對'安全'有什麼打算?如果您的目的是阻止人們上傳實際上是其他文件類型的MP3文件(通常是爲了注入HTML,Java或Flash內容以進行跨站點腳本攻擊),那麼沒有切實可行的方法來執行此操作。您可以製作有效MP3文件,但也可能同時被解釋爲另一種類型。 (請參閱'GIFAR'攻擊; MP3也可能發生這種攻擊。)

最終,唯一可以可靠地保護您免受XSS攻擊的方法是從不與不共享安全上下文的不同用戶上傳的文件主站點,所以跨站點腳本進入它沒有收穫。您也可以考慮使用部分解決方案,但也可以使用Content-Disposition: attachment標頭(如果您不需要託管在頁面上以內聯方式顯示的圖像)提供所有文件。

+0

是的,我不知道。我總是看到youtube如何讓你上傳任何東西,但如果不是視頻,它說你「對不起」。我認爲我有很多我想要的信息。謝謝。 – mRt 2010-07-10 15:33:24