【发布时间】:2015-11-29 08:07:46
【问题描述】:
我有一个用 ImageMagick 处理图像的东西。 ImageMagick 有一个可重现的错误,导致它或多或少地将系统锁定在某些错误的大图像上:
https://hackerone.com/reports/390
为了避免这种情况,我在将图像发送到 ImageMagick 之前使用 ImageIO 来加载图像,因为 ImageIO.read() 在发现荒谬的像素数时会爆炸(它会抛出异常消息:“width*高度 > Integer.MAX_VALUE!")。
问题在于 ImageIO 不像 ImageMagick 那样容忍损坏或格式不正确的图像,我不想追究和处理 ImageMagick 可以很好地处理的已知和未知边缘情况。
我希望在不使用 ImageMagick 的加载或 ImageIO.read() 的情况下验证 JPEG、PNG、TIF、ICO 和 GIF 图像的合理尺寸。如果需要,我可以限制为 50 MP。
【问题讨论】:
-
而 ImageMagick 的 ping 方法对你不起作用?
-
@emcconville 虽然我自己肯定更喜欢使用 ImageIO 而不是 ImageMagick,但我认为只选择一个库更有意义。 ImageMagick 的 ping 听起来应该可以完成这项工作。
-
我同意@haraldK。也许OP可以澄清。您是在寻求构建容错系统的建议,还是寻求消除此类库依赖的技术?正如 haraldK 指出的 in his answer,构建自己的将是一项巨大的工作,并且仍然容易受到其他 DoS 攻击(例如图像数据中的 zipbombs 阻碍)。
-
ImageMagick 的 ping(加载基本文件信息)在这里没有帮助,因为它以通常的方式确定图像的尺寸。我的目标是防止 ImageMagick 在加载此处引用的“有毒”图像时锁定系统:Dubiously Large Image
-
目前依赖ImageMagick及时替换的太多了。
标签: java image imagemagick javax.imageio