Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能保护自己免受拉链炸弹的伤害?_Java_Python_Security_Compression_Zip - Fatal编程技术网

Java 我怎样才能保护自己免受拉链炸弹的伤害?

Java 我怎样才能保护自己免受拉链炸弹的伤害?,java,python,security,compression,zip,Java,Python,Security,Compression,Zip,我刚刚读到,即包含大量高度可压缩数据(00000000000000000…)的zip文件 打开时,它们会填满服务器的磁盘 如何在解压缩前检测到zip文件是zip炸弹 更新您能告诉我在Python或Java中是如何实现的吗?如果您使用的ZIP解压器可以提供原始大小和压缩大小的数据,您可以使用这些数据。否则,请开始解压缩并监视输出大小-如果输出大小过大,请将其松开。首先检查压缩头:)确保您没有将系统驱动器用于临时存储。我不确定如果遇到病毒,病毒扫描公司是否会检查它 您还可以查看zip文件中的信息并检

我刚刚读到,即包含大量高度可压缩数据(00000000000000000…)的zip文件

打开时,它们会填满服务器的磁盘

如何在解压缩前检测到zip文件是zip炸弹


更新您能告诉我在Python或Java中是如何实现的吗?

如果您使用的ZIP解压器可以提供原始大小和压缩大小的数据,您可以使用这些数据。否则,请开始解压缩并监视输出大小-如果输出大小过大,请将其松开。

首先检查压缩头:)

确保您没有将系统驱动器用于临时存储。我不确定如果遇到病毒,病毒扫描公司是否会检查它

您还可以查看zip文件中的信息并检索内容列表。如何执行此操作取决于用于提取文件的实用程序,因此您需要在此处提供更多信息

在Python中尝试以下操作:

导入zipfile
将zipfile.zipfile('a_file.zip')作为z
打印(f'total files size={sum(e.file_size for e in z.infolist())}')

阅读维基百科上的描述-

拒绝包含压缩文件的任何压缩文件。
用于检索文件列表,然后查找文件扩展名。
拒绝包含超过设置大小的文件的任何压缩文件,或者在启动时无法确定大小。

迭代文件时,使用以检索文件大小。

不允许上载过程写入足够的数据以填满磁盘,即解决问题,而不仅仅是问题的一个可能原因。

Zip是一种“有趣”的格式。一个健壮的解决方案是将数据流式输出,并在数据足够时停止。在Java中,使用
ZipInputStream
而不是
ZipFile
。后者还要求您将数据存储在一个临时文件中,这也不是最好的主意。

压缩比可以是1000:1—不仅消耗大量磁盘空间,而且写入输出也需要很长时间。至少在gzip中,我认为未压缩的大小可能不在头中(因此它可能与zip一起工作,但与.tar.gz不一起工作)IIRC,zip标准(让我们面对现实,如果你想引起DoS,你必须遵循标准)允许从中心目录和条目标题中删除某些大小。最著名的zip炸弹将通过此测试,因为第一级不是很大。您需要检查zip深度(zip内部zip)还有。@ZZ编码器,嗯,这是真的。汤姆·霍丁-塔克林的解决方案更好,如果你同时解压所有级别。@凯文,你问解压过程是否确实验证了“大小”属性?很好。如果不是,那么上面的代码当然会“失败”。检查尼克·丹杜拉基斯答案中的注释