2012-08-07 30 views
4

我有一臺服務器上有一些非常敏感的信息,所以安全性是一個大問題。用戶需要能夠上傳視頻。我知道允許用戶上傳文件構成安全威脅,因爲沒有100%的方法阻止他們上傳非視頻。但我顯然可以選擇服務器將保留哪些文件。如何驗證上傳的文件是視頻?

我知道檢查文件擴展名是不夠的。檢查MIME類型更好,但它仍然可能是僞造的。那麼,如何檢查文件是否爲視頻?

+1

使用'ffmpeg'來檢查視頻的長度。實際上,一個高度安全的服務器不應該接受像這樣的上傳。讓用戶上傳到不同的服務器(或者更好,如Amazon S3)。 – ceejayoz 2012-08-07 17:25:59

+0

我看不到上傳東西會帶來怎樣的安全威脅。 – Andrey 2012-08-07 17:26:36

+0

另一種選擇是使用getID3()來獲取視頻的基本內容,並確定它是否具有某些特徵以確定它的絕對性。 http://getid3.sourceforge.net/。以下是您可以從視頻文件中獲取的數據示例:http://www.getid3.org/demo/RIFF-AVI%20-%20cmr3-tv-mpeg4.avi.html – 2012-08-07 17:28:24

回答

9

玩了!

唯一確定的方法是解碼所討論類型的視頻,看看它(並檢查是否有明顯的結果,如非零持續時間)。

否則雖然你的風險很低:

非惡意的情景:

  1. 上傳上傳視頻,與視頻/ *內容類型。
  2. 您存儲八位字節和內容類型。
  3. 下載器下載視頻,並使用您收到的內容類型。
  4. 下載手錶視頻(或約抱怨編解碼器等)

惡意場景1:

  1. 上傳上傳一個討厭的木馬,與視頻/ *內容類型。
  2. 您存儲八位字節和內容類型。
  3. Downloader下載令人討厭的木馬,並使用您收到的內容類型。
  4. Downloader在視頻播放器中打開討厭的木馬。討厭的特洛伊什麼都不做,因爲它不是視頻。用戶抱怨編解碼器。更糟糕的情況是,他們寫咆哮關於缺乏專有格式的支持Ubuntu論壇,將您的網頁有關網站如何吮吸,因爲視頻沒有工作,等

惡意場景上虐待拼寫評論2:

  1. 上傳器上傳了寫入視頻的惡意木馬,該視頻利用了流行視頻播放器的一些緩衝區溢出問題。
  2. 你店...
  3. 下載...
  4. 可能只是像上面的一個,但它也可能是因爲他們得到擊中攻擊(如果他們正在使用受影響的玩家)。

三件事情需要注意的情況,雖然2:

  1. 測試它的視頻將無法保證安全的,因爲它很可能有一些球員也很好地工作。
  2. 測試它的視頻可以讓您的服務器容易受到攻擊,如果攻擊是ffmpeg的!這種類型的
  3. 漏洞都是罕見的,很難做到。一般風險與上傳和下載JPEG或PNG相同。實際上它有點小(這種類型的攻擊實際上影響了常用的jpeg庫)。

總之,只要確保您只輸出您接受的內容類型,並強制文件擴展名匹配它們;如果用戶上傳的視頻/ MPEG叫hahaha.exe,然後將其重命名hahaha.mpg

編輯:哦,還:

惡意場景3:

上傳上傳視頻,它利用一些球員在使用大量資源的方式。在這種情況下,一個下載器會殺死-9/ctrl-alt-delete/your-OSs-kill-them-all-of-choice,但是如果你的服務器正在測試它是一個視頻,那麼它可能最終陷入麻煩,沒有人可以介入並殺死200人(隨着腳本小子的腳本不斷上傳,他們正在試圖解釋的「視頻」)。

只是做普通的視頻處理可能足以引進能力DoS攻擊你(視頻處理是比較重的畢竟),因此比它節省您從測試文件可能推出更多的危險。

+0

該網站對於誰可以使用它非常有限。惡意用戶並不期望,但總是很安全。我主要關心的是他們上傳一個他們不知道有惡意軟件的文件。 – 2012-08-07 17:55:16

+0

我不擔心,直到流行的視頻播放器中使用緩衝區溢出爲止。我更擔心的是,過多的測試會讓您對正在測試的代碼開放DoS。 – 2012-08-07 17:57:48

2

用戶可以安全地上傳任何東西,只要它進入正確的目錄,服務器上的任何內容都不會嘗試運行它(並且如果它應該是視頻,則不會嘗試)。除非受害者以某種方式激活它,否則惡意軟件無法做任何事情。

2

您可以通過PHP擴展調用ffmpeg

https://github.com/char0n/ffmpeg-php/

基本上包裹的ffmpeg的輸出,你可以再在PHP檢查。但是,您應該首先與ffmpeg親密接觸,這本身就是一個完整的話題。如果你不想使用庫,你可以通過exec自己執行ffmpeg。

此外,我會檢查mimetype。你也可以在通過JS輸入的文件中檢查客戶端上的文件(不是在所有的瀏覽器中,這是替換爲真正的驗證)。

LG,

FLO

0

我同意,除非視頻播放器都可以通過一些損壞的視頻文件被利用的問題,我不會擔心太多。但是對於說不一定安全原因不得不檢查你的文件是視頻文件和所有的它是有效的,你可以執行該文件執行以下步驟

  1. 運行ffprobe沒有參數。它會提供一些關於該文件的信息。編解碼器,容器,持續時間,幀率,比特率。
  2. 現在用-show_packets運行ffprobe。它應該發出關於該文件的逐幀信息。您應該獲得與第一條命令給出的duration * frame_rate一樣多的視頻幀。這可以檢查,因爲有人可以只給一個製作的頭或文件的初始段可能是有效的視頻(ffmpeg的和ffprobe只會測試視頻的前幾秒鐘,以驗證其類型),其餘的可能會損壞。
  3. 使用-show_frames運行ffprobe。這將嘗試解碼每個幀的標題,以確保每個幀都是有效的視頻幀。這是一個額外的步驟,因爲某些容器只有一個可用於show_packets的表。因此,ffprobe可以簡單地讀取該表並且它指向的數據可能已損壞。

現在它在理論上是可能一個文件的每一個幀,但錯誤的數據,但沒有解碼的實際內容和觀看它在播放器上,這是你可以AFAIK做的最好的所有有效標題。我會說這已經夠好了,而且速度非常快。