Безопасность загрузки изображений - повторная обработка с помощью GD - PullRequest
3 голосов
/ 18 марта 2012

Я слышал, что лучший способ обработки загруженных изображений - это их повторная обработка с использованием библиотеки GD и сохранение обработанного изображения.см .: Контрольный список безопасности загрузки изображений PHP

Мой вопрос: как выполнить эту "повторную обработку" в GD?Что это значит именно?Я не очень хорошо знаю библиотеку GD, и я боюсь, что я все испорчу ...

Так что, если кто-то, кто делал это раньше, мог бы вы дать мне пример для этого?* (Я знаю, другой вариант - использовать ImageMagick. Для ImageMagick я нашел ответ здесь: Удалить EXIF-данные из JPG с помощью PHP , но я не могу сейчас использовать ImgMagick.Данные EXIF ​​означают полностью воссоздать изображение в этом случае?)
(я использую Zend Framework, если кто-то заинтересован.)

Ответы [ 2 ]

4 голосов
/ 18 марта 2012

Если пользователь загружает файл JPEG, вы можете сделать что-то подобное для его повторной обработки:

$newIm = @imagecreatefromjpeg($_FILES['file']['tmp_name']);
if (!$newIm) {
    // gd could not create an image from the source
    // most likely, the file was not a valid jpeg image
}

Вы можете затем удалить изображение $newIm с помощью imagedestroy () и использовать загруженный файл от пользователя, либо сохранить изображение из GD и использовать его. При сохранении изображения GD могут возникнуть некоторые проблемы, поскольку оно не является исходным.

Другой простой способ - проверить заголовок (первые несколько байтов) файла изображения, чтобы убедиться в его правильности; например, все файлы JPEG начинаются с 0xff 0xd8.

См. Также imagecreatefromstring () , и вы также можете использовать getimagesize () для запуска аналогичных проверок загруженного изображения.

2 голосов
/ 18 марта 2012
function isvalidjpeg($file) 
{ 
$finfo = finfo_open(FILEINFO_MIME_TYPE);
return is_resource($finfo) && 
       (finfo_file($finfo, $file) === 'image/jpeg') && 
       finfo_close($finfo);
}
if(isvalidjpeg($_FILES['file']['tmp_name'])) {
   $newIm = @imagecreatefromjpeg($_FILES['file']['tmp_name']); .....
...