Apache POI 会定期打开 zip 文件,因为 Microsoft Excel/Word/... 文件是较新格式的 zip 文件。为了防止某些类型的拒绝服务攻击,它在打开 Zip 文件时具有不读取扩展很多的文件的功能,因此可以通过提供一个小的恶意文件来淹没主内存,当解压缩到内存中。 Apache POI 将此称为 zip-bomb-protection。
在 Java 9 之前,它可以通过反射使用一些变通方法将计数输入流注入(inject) ZipFile/ZipEntry 以检测扩展数据中的爆炸,并通过这种方式防止压缩炸弹。
但是在 Java 10 中,这不再是可能的,因为 ZipFile 的实现以防止这种情况发生的方式发生了变化(在 ZipFile 中硬转换为 ZipFile$ZipFileInputStream)。
所以我们正在寻找一种不同的方法来计算提取过程中提取的字节数,以便能够在压缩率达到一定限制时立即停止。
有没有一种方法可以在不诉诸反射的情况下以不同的方式进行 zip-bomb-detection?
最佳答案
经过一些调查,我们使用了 Apache commons-compress 的 zip 功能,它允许执行这种检查而无需诉诸反射,因此我们现在可以使用任何版本的 Java 进行这些检查。
看https://github.com/apache/poi/tree/trunk/src/ooxml/java/org/apache/poi/openxml4j/util对于 Apache POI 中的最终实现,尤其是 ZipArchiveThresholdInputStream
。
关于java - 如何使用 Java 10 检测 zip-bomb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585900/