2009-09-22 49 views
47

我剛剛閱讀了關於zip bombs,即包含非常大量高度可壓縮數據(00000000000000000 ...)的zip文件。我該如何保護自己免受拉鍊炸彈的侵害?

打開時,它們會填充服務器的磁盤。

我該如何檢測一個zip文件是拉鍊炸彈之前是解壓縮嗎?

UPDATE你能告訴我這是如何在Python或Java中完成的嗎?

+1

壓縮比率可能會像1000到1一樣 - 不僅消耗大量磁盤空間,而且需要很長時間才能寫入輸出。 – sharptooth

+1

[關於gzip和bzip2的相關問題](http://stackoverflow.com/questions/13622706/how-to-protect-myself-from-a-gzip-or-bzip2-bomb)。 –

回答

20

試試這個在Python:在維基百科上

import zipfile 
z = zipfile.ZipFile('c:/a_zip_file') 
print 'total files size=', sum(e.file_size for e in z.infolist()) 
z.close() 
+5

至少在gzip中,我認爲未壓縮的大小可能不在標題中(所以它可能適用於zip,但不適用於.tar.gz) – tonfa

+0

@tonfa,感謝提及zipfile doesn不處理gnu zip格式。 –

+4

IIRC,Zip標準(讓我們面對它,如果你想引發DoS,你必須遵循標準)允許從中央目錄和條目標題中刪除特定的大小。 –

4

如果您使用的ZIP解壓縮程序可以提供原始和壓縮大小的數據,則可以使用該數據。否則,開始解壓縮並監視輸出大小 - 如果它增長過多,則將其鬆開。

5

首先查看zip標題:)

+2

查看Nick Dandoulakis的回答 – n611x007

1

確保您沒有使用系統驅動器進行臨時存儲。我不確定一個virusscanner是否會在遇到它時檢查它。

此外,您可以查看zip文件中的信息並檢索內容列表。如何做到這一點取決於用於提取文件的工具,所以你需要提供更多的信息在這裏

10

閱讀過描述 -

拒絕任何包含壓縮文件的壓縮文件。
         使用ZipFile.entries()檢索文件列表,然後ZipEntry.getName()找到文件擴展名。
拒絕包含超過設定大小的文件的任何壓縮文件,或者在啓動時無法確定大小。
         雖然遍歷文件使用ZipEntry.getSize()來檢索文件大小。

4

不要讓上傳過程寫入足夠的數據來填充磁盤,即解決問題,而不僅僅是問題的一個可能原因。

19

Zip是一個「有趣」的格式。一個可靠的解決方案是流出數據,並在足夠的時候停止。在Java中,使用ZipInputStream而不是ZipFile。後者還要求您將數據存儲在臨時文件中,這也不是最大的想法。

相關問題