如何防止zip炸弹攻击?

59 投票
7 回答
31237 浏览
提问于 2025-04-15 14:30

我刚刚读到关于压缩炸弹的内容,也就是那些包含大量可以被高度压缩数据的压缩文件(比如00000000000000000...)。

当这些文件被打开时,会占满服务器的硬盘空间。

我想知道如何在解压之前就能检测出一个压缩文件是否是压缩炸弹?

更新:你能告诉我在Python或Java中是怎么做到的吗?

7 个回答

13

在维基百科上阅读描述时,

要拒绝任何包含压缩文件的压缩文件。
可以使用 ZipFile.entries() 来获取文件列表,然后用 ZipEntry.getName() 来查找文件的扩展名。
拒绝任何包含超过设定大小的文件的压缩文件,或者在启动时无法确定文件大小的压缩文件。
在遍历文件时,可以使用 ZipEntry.getSize() 来获取文件的大小。

25

Zip是一种“有趣”的文件格式。一个比较稳妥的做法是把数据流出来,直到你觉得够了为止。在Java中,建议使用ZipInputStream,而不是ZipFile。因为后者需要把数据存储在一个临时文件里,这样做其实并不是个好主意。

27

试试这个Python代码:

import zipfile

with zipfile.ZipFile('a_file.zip') as z
    print(f'total files size={sum(e.file_size for e in z.infolist())}')

撰写回答