设置“资源区域”限制仅设置图像不保存在内存中而是分页到磁盘的大小。如果您想使用该设置来实际限制可以打开的最大图像尺寸,您还需要设置“资源磁盘”限制。
下面的代码正确地给出了所拍摄图像炸弹的内存分配错误从这里 http://www.aerasec.de/security/advisories/decompression-bomb-vulnerability.html.
try {
Imagick::setResourceLimit(Imagick::RESOURCETYPE_AREA, 2000 * 2000);
Imagick::setResourceLimit(Imagick::RESOURCETYPE_DISK, 2000 * 2000);
$imagick = new Imagick("./picture-100M-6000x6000.png");
$imagick->modulateImage(100, 50, 120);
$imagick->writeImage("./output.png");
echo "Complete";
}
catch(\Exception $e) {
echo "Exception: ".$e->getMessage()."\n";
}
输出是:
异常:内存分配失败 `./picture-100M-6000x6000.png' @ error/png.c/MagickPNGErrorHandler/1630
如果您想设置宽度和高度资源,并且 ImageMagick >= 6.9.0-1 的版本您应该能够直接使用 WidthResource = 9、HeightResource = 10 的值
//Set max image width of 2000
Imagick::setResourceLimit(9, 2000);
//Set max image height of 1000
Imagick::setResourceLimit(10, 1000);
这些不必以编程方式设置,您可以通过策略.xml http://www.imagemagick.org/script/resources.php使用 ImageMagick 安装的文件。 ImageMagick 读取该文件并使用这些设置(如果程序中没有设置) - 这可能是设置它们的更方便的方法,因为您可以在每台机器上更改它们。
这让我无法妥善处理。
让你无法应对在同一个过程中。您可以通过在后台任务中运行图像处理来很好地处理它。
就我个人而言,我认为无论如何在由网络浏览器直接访问的服务器中使用 Imagick 都是疯狂的。将其作为后台任务运行要安全得多(由类似的东西管理)http://supervisord.org/ http://supervisord.org/)并通过需要处理的作业队列与该后台任务进行通信。
这不仅解决了“不良图像可能导致网站瘫痪”的问题,还使监控资源使用情况变得更加容易,或者将图像处理转移到 CPU 比 Web 前端服务器所需的速度更快的计算机上。
来源 - 我是 Imagick 扩展的维护者,我最近将其添加到 Imagick 自述文件中:
Security
PHP 扩展 Imagick 通过调用 ImageMagick 库来工作。
尽管 ImageMagick 开发人员非常小心地避免错误,但
代码中不可避免地会出现一些错误。图像魔术师
还使用了很多第三方库来打开、读取和操作
文件。这些库的作者在写的时候也很用心
他们的代码。然而每个人都会犯错,并且难免会犯错
存在一些错误。
因为ImageMagick是用来处理图像的,所以是可行的
黑客可以创建包含无效数据的图像来尝试
利用这些错误。因此,我们建议如下:
1)不要在可直接访问的服务器上运行Imagick
在您的网络之外。最好将其用作背景
使用 SupervisorD 之类的任务或在单独的环境中运行它
不能直接通过互联网访问的服务器。
这样做将使黑客很难利用漏洞,即使
是否应该存在于 ImageMagick 正在使用的库中。
2)将其作为特权非常低的进程运行。尽可能地
Imagick 的 PHP 脚本可访问的文件和系统资源
正在拨打的电话应该被锁定。
3)检查图像处理结果是否为有效的图像文件
在将其显示给用户之前。在极不可能发生的情况下
黑客能够将任意文件传输到 Imagick 的输出,
检查它是一个图像文件,而不是你的源代码
正在发送的申请是明智的预防措施。