Установка предела «Ресурсная область» устанавливает только размер, в котором изображения не хранятся в памяти, а вместо этого выгружаются на диск. Если вы хотите использовать этот параметр для фактического ограничения изображения максимального размера, которое может быть открыто, вам также необходимо установить ограничение «Resource Disk».
Правильный код, приведенный ниже, дает ошибку выделения памяти для взятых ими изображений. 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";
}
Выход:
Исключение: ошибка выделения памяти `./picture-100M-6000x6000.png» @ ошибка/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 считывает этот файл и использует эти параметры, если в программе не установлено ни одного, что может быть более удобным способом их настройки, так как вы можете изменить их на одну машину.
Это делает невозможным правильное обращение с ним.
Это не позволяет вам обработать его в том же процессе. Вы можете справиться с этим просто, выполнив обработку изображения в фоновом задании.
Лично я думаю, что в любом случае использование Imagick на сервере, к которому напрямую обращаются веб-браузеры, - это орехи. Гораздо безопаснее запускать его в качестве фоновой задачи (управляется чем-то вроде http://supervisord.org/) и обмениваться данными с этой фоновой задачей через очередь заданий, которые необходимо обработать.
Это не только позволяет решить проблему с «плохими изображениями», но и облегчает мониторинг использования ресурсов или переносит обработку изображений на машину с более быстрым процессором, чем на веб-интерфейс сервер.
Источника - Я сопровождающее расширение Imagick и я недавно добавил это риое Imagick:
Security
удлиняющую PHP Imagick работает путем вызова библиотеки ImageMagick. Несмотря на то, что разработчики ImageMagick стараются избегать ошибок, неизбежно, что некоторые ошибки будут присутствовать в коде. ImageMagick также использует множество сторонних библиотек для открытия, чтения и обработки файлов . Писатели этих библиотек также заботятся о написании кода . Однако все делают ошибки, и неизбежно будет .
Поскольку ImageMagick используется для обработки изображений, возможно, для хакеров для создания изображений, содержащих недопустимые данные, чтобы попытаться использовать . В связи с этим мы рекомендуем следующее:
1) Не запускайте Imagick на сервере, который напрямую доступен из вне сети. Лучше либо использовать его как задачу , используя что-то вроде SupervisorD, либо запустить его на отдельном сервере , который не имеет прямого доступа в Интернете.
Выполнение этого будет затруднено для хакеров использовать ошибку, даже , если она существует в библиотеках, которые использует ImageMagick.
2) Запустите его как очень низкоприоритетный процесс. В максимально возможной степени должны быть заблокированы файлы и системные ресурсы , доступные для PHP-скрипта, из которого вызывается Imagick .
3) Проверьте, является ли результат обработки изображения действительным файлом изображения перед его отображением пользователю. В крайне маловероятном случае, что хакер способен передавать произвольные файлы на вывод Imagick, , проверяя, что это файл изображения, а не исходный код вашего отправляемого приложения , является разумной мерой предосторожности.
Открытый вопрос: может ли быть какой-то низкоуровневый код, который может сканировать блоки сжатия и/или размер изображения до вызова ImageMagick? – halfer