- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前在 PHP 上使用 Imagick 库并使用 Image Magick 的调整大小功能。我刚刚了解了减压炸弹以及 ImageMagick 如何容易受到它的攻击。</p>
我已经检查了如何在不实际将图像加载到内存/磁盘的情况下对图像执行 ping 操作并验证图像的尺寸。限制 ImageMagick 的内存和磁盘限制也更安全,这样它就不会在磁盘上写入一个巨大的文件。
我已经阅读并可以使用 setResourceLimit() 来实现。 http://php.net/manual/en/imagick.setresourcelimit.php
IMagick::setResourceLimit(IMagick::RESOURCETYPE_MEMORY , 100);
IMagick::setResourceLimit(IMagick::RESOURCETYPE_DISK , 100);
$thumb = new Imagick('image.png');
$thumb->resizeImage(320,240,Imagick::FILTER_LANCZOS,1);
然而,在设置磁盘和内存限制后,如果图像确实达到了这个限制,我得到的只是一个段错误错误,不会抛出任何异常。这让我无法妥善处理。
更新:
这是我使用的包版本:
dpkg -l | grep magick
ii imagemagick-common 8:6.6.9.7-5ubuntu3.3 image manipulation programs -- infrastructure
ii libmagickcore4 8:6.6.9.7-5ubuntu3.3 low-level image manipulation library
ii libmagickwand4 8:6.6.9.7-5ubuntu3.3 image manipulation library
ii php5-imagick 3.1.0~rc1-1 ImageMagick module for php5
最佳答案
设置“资源区”限制仅设置图像不保存在内存中的大小,而是分页到磁盘。如果您想使用该设置来实际限制可以打开的最大图像大小,您还需要设置“资源磁盘”限制。
下面的代码正确给出了图像炸弹的内存分配错误 from here .
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";
}
输出是:
Exception: Memory allocation failed `./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);
这些不必以编程方式设置,您可以通过 policy.xml 设置它们随 ImageMagick 安装的文件。如果程序中没有设置,ImageMagick 会读取该文件并使用这些设置 - 这可能是一种更方便的设置方式,因为您可以在每台机器上更改它们。
This makes it impossible for me to handle it properly.
这让您无法在同一个进程中处理它。您可以通过在后台任务中运行图像处理来很好地处理它。
我个人认为无论如何,在可由网络浏览器直接访问的服务器中使用 Imagick 是疯狂的。将它作为后台任务运行(由 http://supervisord.org/ 之类的东西管理)并通过需要处理的作业队列与该后台任务通信要安全得多。
这不仅解决了“糟糕的图像会导致我的网站瘫痪”的问题,还使监控资源使用情况变得更加容易,或者将图像处理转移到 CPU 比 Web 前端服务器更快的机器上需要。
来源 - 我是 Imagick 扩展的维护者,我最近将其添加到 Imagick 自述文件中:
Security
The PHP extension Imagick works by calling the ImageMagick library. Although the ImageMagick developers take good care in avoiding bugs it is inevitable that some bugs will be present in the code. ImageMagick also uses a lot of third party libraries to open, read and manipulate files. The writers of these libraries also take care when writing their code. However everyone makes mistakes and there will inevitably be some bugs present.
Because ImageMagick is used to process images it is feasibly possible for hackers to create images that contain invalid data to attempt to exploit these bugs. Because of this we recommend the following:
1) Do not run Imagick in a server that is directly accessible from outside your network. It is better to either use it as a background task using something like SupervisorD or to run it in a separate server that is not directly access on the internet.
Doing this will make it difficult for hackers to exploit a bug, even if one should exist in the libraries that ImageMagick is using.
2) Run it as a very low privileged process. As much as possible the files and system resources accessible to the PHP script that Imagick is being called from should be locked down.
3) Check the result of the image processing is a valid image file before displaying it to the user. In the extremely unlikely event that a hacker is able to pipe arbitrary files to the output of Imagick, checking that it is an image file, and not the source code of your application that is being sent, is a sensible precaution.
关于php - 如何使用 ImageMagick 防止图像炸弹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31543899/
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
请原谅这个有趣的标题,我用它来比喻“zip bomb”。是否可以创建一个 Scala 源文件,该文件在编译时会生成大量类文件(或非常大的单个类文件)?有什么办法可以让类文件的大小比源文件的大小线性增长
我玩 Unix 有一段时间了,我刚刚发现了一段可爱的代码,每个人都称之为 fork 炸弹::(){ :|:& };:。我想尝试一下,但我知道它会像疯了一样滞后我的计算机,所以我只是想知道是否有人可以给
如果您已经登录系统,如何阻止 fork 炸弹? 最佳答案 斯雷, 如果您在 shell 中仍然拥有“控制权”,则可以尝试使用 ps 和 grep,以及一些 awk,然后是一个循环,以关闭包括父进程在内
可以使用 fork 炸弹(无限 fork )进行拒绝服务攻击。进程表很快就会满,系统就会崩溃。 在线编译器(如编程竞赛)如何处理此类代码。他们有时间限制吗?如果某些程序有几秒的时间限制,它们的进程表将
This question关于 zip 炸弹自然而然地把我带到了 Wikipedia page关于这个话题。文章提到了一个 45.1 kb 的 zip 文件解压缩到 1.3 艾字节的示例。 首先用于创
我正在学习C,遇到了一个小问题。在维基百科和 StackOverflow 上阅读了有关 fork() 炸弹的内容后。我想实现相同的功能,但使用命令行参数。 我想无休止地调用 firefox/chrom
我正在使用 XercesDOMParser 在 linux (c++) 中读取 xml 文件,我想防止 xml 炸弹(Billion 笑)所以我设置了这些属性: parser->setDoNamesp
`#include #include int main(int argc, char **argv){ int pid = 0; int forever; static c
我写了一些这样的代码: std::vector unzip(std::vector const& compressed) { std::vector decompressed; boost
当我有时使用 Apache POI 创建 xlsx 文件时(当文件很大时),它会创建这样一个文件,该文件无法由同一个 Apache POI 打开,而 MS Excel 或 LibreOffice Ca
我使用 Nodejs 应用程序(expressjs、request 等)在网络主机上托管一个网站。 Web 主机有一个 apache 终端,我可以从其中调用 node app.js & 或 forev
代码如下 XmlDocument xdoc = new XmlDocument(); String xml = @"" + "" +
我是一名优秀的程序员,十分优秀!