在不使用 ImageMagick 或 ImageIO 的情况下,在 Java 中验证正常的图像尺寸
Verify sane image dimensions in Java without ImageMagick or ImageIO
我有一个用 ImageMagick 处理图像的东西。 ImageMagick 有一个可重现的错误,导致它或多或少地将系统锁定在某些虚假的大图像上:
https://hackerone.com/reports/390
为了避免这种情况,我在将图像发送到 ImageMagick 之前使用 ImageIO 加载图像,因为 ImageIO.read() 在发现荒谬的像素数时会爆炸(它会抛出异常消息: "width*height > Integer.MAX_VALUE!").
问题是 ImageIO 不像 ImageMagick 那样容忍损坏或格式不正确的图像,我不想追查和处理 ImageMagick 处理得很好的已知和未知的边缘情况。
我希望在不使用 ImageMagick 加载或 ImageIO.read() 的情况下验证 JPEG、PNG、TIF、ICO 和 GIF 图像的合理尺寸。如果需要,我可以限制为 50 MP。
使用 ImageIO 获取 ImageReader
,然后查询 ImageReader
的宽度和高度,而不实际加载图像。
try (ImageInputStream stream = ImageIO.createImageInputStream(input)) {
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);
if (readers.hasNext()) {
ImageReader reader = readers.next();
reader.setInput(stream);
// Get width/height of first image in file
// (alternatively, use getNumImages() and loop over all images)
int w = reader.getWidth(0);
int h = reader.getHeight(0);
if (w * h > SANE_MAX_SIZE) {
// TODO: Handle image too large
}
}
}
尽管 ImageIO 的容错能力较差,您可能仍然会遇到问题。
我建议使用我自己的 TwelveMonkeys ImageIO 插件(支持 TIFF、ICO 并添加更好的 JPEG 支持),但我想您也可以使用 Apache Commons Imaging 或其他库。
最后的办法是自己编写代码来解析所有这些格式。但我认为,如果您不付出相当大的努力,那么与现有解决方案相比错误更少的可能性很小...;-)
我有一个用 ImageMagick 处理图像的东西。 ImageMagick 有一个可重现的错误,导致它或多或少地将系统锁定在某些虚假的大图像上:
https://hackerone.com/reports/390
为了避免这种情况,我在将图像发送到 ImageMagick 之前使用 ImageIO 加载图像,因为 ImageIO.read() 在发现荒谬的像素数时会爆炸(它会抛出异常消息: "width*height > Integer.MAX_VALUE!").
问题是 ImageIO 不像 ImageMagick 那样容忍损坏或格式不正确的图像,我不想追查和处理 ImageMagick 处理得很好的已知和未知的边缘情况。
我希望在不使用 ImageMagick 加载或 ImageIO.read() 的情况下验证 JPEG、PNG、TIF、ICO 和 GIF 图像的合理尺寸。如果需要,我可以限制为 50 MP。
使用 ImageIO 获取 ImageReader
,然后查询 ImageReader
的宽度和高度,而不实际加载图像。
try (ImageInputStream stream = ImageIO.createImageInputStream(input)) {
Iterator<ImageReader> readers = ImageIO.getImageReaders(stream);
if (readers.hasNext()) {
ImageReader reader = readers.next();
reader.setInput(stream);
// Get width/height of first image in file
// (alternatively, use getNumImages() and loop over all images)
int w = reader.getWidth(0);
int h = reader.getHeight(0);
if (w * h > SANE_MAX_SIZE) {
// TODO: Handle image too large
}
}
}
尽管 ImageIO 的容错能力较差,您可能仍然会遇到问题。
我建议使用我自己的 TwelveMonkeys ImageIO 插件(支持 TIFF、ICO 并添加更好的 JPEG 支持),但我想您也可以使用 Apache Commons Imaging 或其他库。
最后的办法是自己编写代码来解析所有这些格式。但我认为,如果您不付出相当大的努力,那么与现有解决方案相比错误更少的可能性很小...;-)