【问题标题】:Apache POI creates xlsx file which it can't open later. Zip bomb detectedApache POI 创建了以后无法打开的 xlsx 文件。检测到拉链炸弹
【发布时间】:2017-12-12 14:06:52
【问题描述】:

当我有时使用 Apache POI 创建 xlsx 文件时(当文件很大时),它会创建一个无法由同一个 Apache POI 打开的文件,而 MS Excel 或 LibreOffice Calc 可以毫无问题地打开它。

当我尝试使用 Apache POI 打开此工作簿时,它显示

检测到邮编炸弹

只有当我调用ZipSecureFile.setMinInflateRatio(0) 或在 LibreOffice 中重新保存它时才能打开它(MS Excel 在这里没有帮助)。

如何解决这个问题?为什么 POI 会创建无法打开的文件?

【问题讨论】:

  • 在我对Question 的回答中,我已经讲述了 zip 炸弹检测的工作原理。所以不是“POI 创建了它无法打开的文件”,而是您正在使用您的代码执行此操作。可能是因为您使用的是完全相同的数千次测试数据,因此导致数据压缩率不太可能。
  • 数据是真实的,它是从另一个 xlsx(在 MS Excel 中创建的)复制而来的,并做了一些更改。该源 xlsx 已打开并完美读取,生成的不是(使用 POI)。正如我所说,如果我在 libreOffice 中不做任何更改就保存它,它会毫无问题地打开,所以问题肯定不在数据中

标签: java excel apache-poi


【解决方案1】:

只需按照错误消息的提示进行操作,并通过

设置不同的限制

ZipSecureFile.setMinInflateRatio(0)

您似乎有一个相当特殊的用例,它生成的文件类似于恶意用户可以用来使您的服务器崩溃、耗尽 CPU 或内存不足的某些文件。为避免这种情况,Apache POI 有此限制,但如果需要,允许对其进行不同的设置。因此,如果文件不是来自不受信任的用户,您可以轻松调整这些限制以避免出现错误消息。

Excel 或 LibreOffice 可能比 Apache POI 更优化文件内容,因此生成的文件不会达到这些限制。

【讨论】:

  • 嗯,这就是我现在要做的,我只是好奇有没有什么方法可以创建没有这个问题的文件
  • 不,我不知道。
  • “LibreOffice 可能会进一步优化文件内容”:恰恰相反。如问题中所述,使用 Excel 打开和保存无济于事。因此,与 Excel 和 POI 相比,LibreOffice 在压缩时的数据压缩率更低。
  • 好的,似乎不知道有什么方法可以制作没有这个问题的 xlsx 文件,所以让这成为答案,只需将 minInflateRatio 设置为 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 2016-02-15
  • 2015-05-12
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多