加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 了解ZipSecureFile.setMinInflateRatio(双倍比例)

发布时间:2020-12-15 04:40:51 所属栏目:Java 来源:网络整理
导读:我正在使用这个函数调用,因为当我读取一个受信任的文件时,它会导致zipbomb错误. ZipSecureFile.setMinInflateRatio(双倍比例) FileInputStream file = new FileInputStream("/file/path/report.xlsx"); ZipSecureFile.setMinInflateRatio(-1.0d); XSSFWorkbo
我正在使用这个函数调用,因为当我读取一个受信任的文件时,它会导致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);

解决方法

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

解压缩时会检查compressBytes / uncompressedBytes的比率,如果低于特殊量(MinInflateRatio),则会检测到炸弹.

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

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

我们有字符串

“这是一个测试,用于压缩具有长字符数的字符,这些字符总是出现相同的序列.”

这需要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为0,则compressionBytes / uncompressedBytes的比率只能为0.但这意味着没有要解压缩的字节.因此,永远不会达到0.0d的MinInflateRatio,也不会低估.因此,当MinInflateRatio为0.0d时,将接受所有可能的比率.

当然,也绝不能达到-1.0d的MinInflateRatio,也不能低于它.因此,使用它也将接受所有可能的比率.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读