了解ZipSecureFile.setMinInflateRatio(双倍比率)

时间:2017-10-18 16:01:45

标签: java excel file apache-poi

我正在使用此函数调用,因为当我读取受信任文件时,会导致zipbomb错误。

ZipSecureFile.setMinInflateRatio(双倍比率)

   FileInputStream file = new FileInputStream("/file/path/report.xlsx"); 
   ZipSecureFile.setMinInflateRatio(-1.0d);
   XSSFWorkbook wb = new XSSFWorkbook(file);

我想了解它是如何运作的?

我能找到的唯一来源是https://poi.apache.org/apidocs/org/apache/poi/openxml4j/util/ZipSecureFile.html

但是,由于我对这个概念不熟悉,因此无法获得清晰的图像。

之间有什么区别
ZipSecureFile.setMinInflateRatio(-1.0d);

vs

ZipSecureFile.setMinInflateRatio(0.009);

vs

ZipSecureFile.setMinInflateRatio(0);

1 个答案:

答案 0 :(得分:7)

拉链炸弹检测的工作方式如下:

虽然解压缩它会检查比率compressedBytes/uncompressedBytes,如果这低于特殊数量(MinInflateRatio),则检测到炸弹。

因此,如果比例compressedBytes/uncompressedBytes0.01d,那么这意味着压缩文件比未压缩文件小100倍,而不会丢失信息。换句话说,压缩文件仅在文件大小的1%中存储相同的信息,未压缩的文件需要。使用现实生活中的数据确实不太可能。

为了表明我们不太可能看到(以流行的科学方式)压缩如何工作:

我们有字符串

"This is a test for compressing having long count of characters which always occurs the same sequence."

这需要101个字节。假设此字符串在文件中出现100,000次。然后解压缩它需要10,100,000个字节。压缩算法会为该字符串提供一个ID,并且只有将字符串映射到该ID后才会存储该字符串,并且将存储该字符串出现在文件中的ID的100,000倍。这将需要101个字节+ 1个字节(ID)+ 100,000个字节(ID)= 100,102个字节。例如,compressedBytes/uncompressedBytes的比例为0.009911089d

因此,如果我们将MinInflateRatio设置为低于0.01d,那么我们会接受这种不太可能的数据压缩率。

我们还可以看到,如果compressedBytes/uncompressedBytes为0,则0的比率只能是compressedBytes。但这意味着没有要解压缩的字节。因此MinInflateRatio 0.0d MinInflateRatio永远不会被触及,也不会被低估。因此0.0d MinInflateRatio -1.0d将接受所有可能的比率。

当然,li:hover ul{ display: block !important; }的{​​{1}}也永远不会被触及也不会被低估。因此,使用它也将接受所有可能的比率。