了解ZipSecureFile.setMinInflateRatio(双比例)
我正在使用这个函数调用,因为当我读取一个可信的文件时,导致zipbomb错误。
ZipSecureFile.setMinInflateRatio(双比例)
FileInputStream file = new FileInputStream("/file/path/report.xlsx"); ZipSecureFile.setMinInflateRatio(-1.0d); XSSFWorkbook wb = new XSSFWorkbook(file);
我想了解它是如何工作的?
我能find的唯一来源是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);
拉链炸弹检测工作如下:
解压缩的时候会检查compressedBytes/uncompressedBytes
的比率,如果低于一个特殊值( MinInflateRatio
),那么就会检测到一个炸弹。
因此,如果比率compressedBytes/uncompressedBytes
为0.01d
,则意味着压缩文件比未压缩文件小100倍,而不丢失信息。 换句话说,压缩文件只在文件大小的1%中存储相同的信息,这是未压缩的文件所需要的。 使用真实的生活数据是不太可能的。
为了说明这是多么的不可能,我们可以看看(以一种stream行的科学方式)压缩的工作原理:
让我们有string
"This is a test for compressing having long count of characters which always occurs the same sequence."
这需要101个字节。 假设这个string在文件中出现了100,000次。 然后解压缩它需要10,100,000字节。 一个压缩algorithm会给这个string一个ID,并且只会将该string映射到该ID并存储该string,并且会在该文件中存储该string的ID的十万倍。 这将需要101字节+ 1字节(ID)+ 100,000字节(ID)= 100,102字节。 例如,这将具有0.009911089d
的比率compressedBytes/uncompressedBytes
。
所以如果我们将MinInflateRatio
设置为低于0.01d
,那么我们接受这种不太可能的数据压缩率。
我们还可以看到,如果compressedBytes
为0,那么compressedBytes/uncompressedBytes
的比率只能是0.但是,这意味着没有解压缩的字节。 因此, MinInflateRatio
的0.0d
永远不能达到,也不能低于。 因此,如果MinInflateRatio
为0.0d
所有可能的比率都将被接受。
MinInflateRatio
的-1.0d
当然也不能达到,也不能低于。 所以使用这个也是所有可能的比例将被接受。