3

想象一个环境,用户可以通过从他们的 PC 上传图像或引用远程 URL 将图像上传到网站。

作为一些安全检查的一部分,我想确保引用的对象确实是一个图像。

对于远程 URL,我当然会检查内容类型,但这不是防弹的。

我想我可以使用 ImageMagick 来完成这项任务。也许执行 ImageMagick.identify() 方法,如果没有返回错误并且返回类型是 JPG|GIF| 等。内容是图像。(在快速检查中,我注意到 TXT 文件也被正确识别,所以我必须将这些文件列入黑名单)

有没有更好的方法来做到这一点?

4

3 回答 3

1

您可能可以简单地通过 ImageMagick 的适当功能加载图像,以适应您选择的语言。如果图像格式不正确(就内部格式而言,而不是其美学属性),我希望 ImageMagick 拒绝加载它并报告错误。例如,在 PHP 中,如果图像加载失败,readImage 将返回 false。

或者,您可以读取文件的前几百个字节并确定是否存在预期的图像文件格式头;例如,“GIF89”等。

于 2012-10-06T15:56:30.963 回答
1

如果您的图像采用可压缩格式(PNG、GIF)并且其构造方式类似于 zip 炸弹https://en.wikipedia.org/wiki/Zip_bomb ,这些检查可能会适得其反

ftp://ftp.aerasec.de/pub/advisories/decompressionbombs/pictures/的一些例子(那个网站没什么特别的,我只是用谷歌搜索了减压炸弹)

另一个相关问题是,像 SVG 这样的格式实际上是 XML,一些图像处理工具容易受到“十亿笑”攻击的变体https://en.wikipedia.org/wiki/Billion_laughs

于 2012-10-07T07:39:53.727 回答
0

您不应该存储原始文件。通常推荐的方法是始终重新处理图像并将其转换为全新的文件。在有效的图像文件中存在漏洞(参见GIFAR),因此对此进行检查是没有用的。

切勿让您的访问者看到您自己没有写出的图像文件,并且您自己也没有为其选择文件名。

于 2012-10-06T15:57:46.190 回答