2009-09-22 8 views
47

私はちょうど約zip bombsを読んでいます。つまり、非常に大量の圧縮率の高いデータ(00000000000000000 ...)を含むzipファイルです。ジップ爆弾から身を守るにはどうすればいいですか?

開いたとき、彼らは、サーバーのディスクを埋めます。

ジップファイルを検出するには、の前にを解凍しますか?

UPDATEこれはPythonまたはJavaでどのように行われますか教えてください。

+1

圧縮率は1000から1のようにsmthにすることができます。ディスク容量を多く消費するだけでなく、出力を書き込むのに時間がかかります。 – 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

を使用すると、一時保管のためのシステムドライブを使用していないことを確認してください。ウイルススキャナが遭遇した場合、ウイルススキャナがそれをチェックするかどうかはわかりません。

また、あなたは、zipファイル内の情報を見て、コンテンツのリストを取得することができます。これを行うにはどのようにあなたがより多くの情報を提供する必要があるので、ファイルを抽出するために使用するユーティリティによって異なり、ここで

10

-

拒否圧縮ファイルを含む圧縮ファイル。
        ZipFile.entries()を使用してファイルのリストを取得し、ZipEntry.getName()を使用してファイル拡張子を探します。
設定されたサイズを超えるファイルを含む圧縮ファイルを拒否するか、起動時にサイズを判断できません。
       ファイルを反復処理しながら、ファイルサイズを取得するためにZipEntry.getSize()を使用しています。

4

アップロードプロセスがディスクのいっぱいになるほどのデータを書き込まないようにします。つまり、問題の原因の1つだけではなく、問題を解決します。

19

Zipは、ERM、 "面白い" 形式です。堅牢なソリューションは、データをストリーミングし、十分な時間が経過したら停止します。 Javaでは、ZipFileではなくZipInputStreamを使用してください。後者の場合は、データを一時的なファイルに保存する必要がありますが、これもまた最大のアイデアではありません。

関連する問題