我有一臺服務器上有一些非常敏感的信息,所以安全性是一個大問題。用戶需要能夠上傳視頻。我知道允許用戶上傳文件構成安全威脅,因爲沒有100%的方法阻止他們上傳非視頻。但我顯然可以選擇服務器將保留哪些文件。如何驗證上傳的文件是視頻?
我知道檢查文件擴展名是不夠的。檢查MIME類型更好,但它仍然可能是僞造的。那麼,如何檢查文件是否爲視頻?
我有一臺服務器上有一些非常敏感的信息,所以安全性是一個大問題。用戶需要能夠上傳視頻。我知道允許用戶上傳文件構成安全威脅,因爲沒有100%的方法阻止他們上傳非視頻。但我顯然可以選擇服務器將保留哪些文件。如何驗證上傳的文件是視頻?
我知道檢查文件擴展名是不夠的。檢查MIME類型更好,但它仍然可能是僞造的。那麼,如何檢查文件是否爲視頻?
玩了!
唯一確定的方法是解碼所討論類型的視頻,看看它(並檢查是否有明顯的結果,如非零持續時間)。
否則雖然你的風險很低:
非惡意的情景:
惡意場景1:
惡意場景上虐待拼寫評論2:
三件事情需要注意的情況,雖然2:
總之,只要確保您只輸出您接受的內容類型,並強制文件擴展名匹配它們;如果用戶上傳的視頻/ MPEG叫hahaha.exe,然後將其重命名hahaha.mpg
編輯:哦,還:
惡意場景3:
上傳上傳視頻,它利用一些球員在使用大量資源的方式。在這種情況下,一個下載器會殺死-9/ctrl-alt-delete/your-OSs-kill-them-all-of-choice,但是如果你的服務器正在測試它是一個視頻,那麼它可能最終陷入麻煩,沒有人可以介入並殺死200人(隨着腳本小子的腳本不斷上傳,他們正在試圖解釋的「視頻」)。
只是做普通的視頻處理可能足以引進能力DoS攻擊你(視頻處理是比較重的畢竟),因此比它節省您從測試文件可能推出更多的危險。
該網站對於誰可以使用它非常有限。惡意用戶並不期望,但總是很安全。我主要關心的是他們上傳一個他們不知道有惡意軟件的文件。 – 2012-08-07 17:55:16
我不擔心,直到流行的視頻播放器中使用緩衝區溢出爲止。我更擔心的是,過多的測試會讓您對正在測試的代碼開放DoS。 – 2012-08-07 17:57:48
用戶可以安全地上傳任何東西,只要它進入正確的目錄,服務器上的任何內容都不會嘗試運行它(並且如果它應該是視頻,則不會嘗試)。除非受害者以某種方式激活它,否則惡意軟件無法做任何事情。
您可以通過PHP擴展調用ffmpeg
:
https://github.com/char0n/ffmpeg-php/
基本上包裹的ffmpeg
的輸出,你可以再在PHP檢查。但是,您應該首先與ffmpeg親密接觸,這本身就是一個完整的話題。如果你不想使用庫,你可以通過exec自己執行ffmpeg。
此外,我會檢查mimetype。你也可以在通過JS輸入的文件中檢查客戶端上的文件(不是在所有的瀏覽器中,這是否替換爲真正的驗證)。
LG,
FLO
我同意,除非視頻播放器都可以通過一些損壞的視頻文件被利用的問題,我不會擔心太多。但是對於說不一定安全原因不得不檢查你的文件是視頻文件和所有的它是有效的,你可以執行該文件執行以下步驟
現在它在理論上是可能一個文件的每一個幀,但錯誤的數據,但沒有解碼的實際內容和觀看它在播放器上,這是你可以AFAIK做的最好的所有有效標題。我會說這已經夠好了,而且速度非常快。
使用'ffmpeg'來檢查視頻的長度。實際上,一個高度安全的服務器不應該接受像這樣的上傳。讓用戶上傳到不同的服務器(或者更好,如Amazon S3)。 – ceejayoz 2012-08-07 17:25:59
我看不到上傳東西會帶來怎樣的安全威脅。 – Andrey 2012-08-07 17:26:36
另一種選擇是使用getID3()來獲取視頻的基本內容,並確定它是否具有某些特徵以確定它的絕對性。 http://getid3.sourceforge.net/。以下是您可以從視頻文件中獲取的數據示例:http://www.getid3.org/demo/RIFF-AVI%20-%20cmr3-tv-mpeg4.avi.html – 2012-08-07 17:28:24