Безопасное копирование
Здравствуйте! С помощью функции copy копирую картинки в папку. Будет ли достаточной защитой от возможных подмен или других возможных внедрений записей кодов в картинку, если я явно запрещу выполнение в папке с картинками скриптов, с переименованием файлов при копировании и установлении определенного расширения, например, gif для всех копированных файлов?
|
А почему вопрос в разделе JS?
Смотря как вы принимаете изображения, по крайней мере функцию copy применять не рекомендуется при сохранении файлов принятых по HTTP. А вот запрещать выполнение скриптов в этой папке да, это правильно, да и от внедренного мусора можно тоже избавиться посредством GD. |
Цитата:
|
Цитата:
|
Например, функция getimagesize() возвращает массив данных о изображении, а если ошибка, то не изображение..
--- Но есть такой вариант http://php.net/manual/ru/function.finfo-file.php --- Можно так же самому по сигнатуре файла определять, что за файл |
Lion777,
Да, о функции читала, но там тоже есть какие-то ухищрения. laimas, А как загружать файл из ссылки, без использования copy, через file_get_contents? |
file_get_contents('http://ссылка');
для проверки используйте расширение fileinfo, должно быть включенно --- http://php.net/manual/ru/ref.fileinfo.php --- echo mime_content_type('image.jpg'); |
Цитата:
|
Цитата:
|
Цитата:
|
Что только GIF? А если будет не этот формат?
|
Пользователь может загрузить только файлы с расширением png, jpg и gif (который в приоритете), на выходе получиться только gif. Читала, что и в целях безопасности это помогает. Читала, что и использование copy, не рекомендуется, но без примеров и указания в каких именно случаях. Посчитала, что в данном случае, это приемлемо, т.к. не увидела "подводных камней" (хотя, это и не говорит о том, что их там нет).
|
Сохранить JPEG, а тем более PNG в GIF, это урезать изображение до безобразия, да еще все и вслепую.
Если к изображению и "приклеят" непотребное, то от exif можно и избавиться, это не проблема. И сам по себе код вклеенный не выполнится, нужен "помощник". Если загрузка по ссылке, то так (используя GD): if($im = imagecreatefromstring(file_get_contents('url'))) { //обработка изображения $im, можно уменьшить его на один пиксель по ширине/высоте, //все что вклеили будет удалено //можно узнать палитру изображения, если индексированная, то сохранять в GIF //иначе сохранять как JPEG //все это функциями GD //стоит учесть, что если GIF анимация, то она будет утеряна, сохранится только первый ее кадр } else { //мусор } |
<?php $addrImage = 'https://javascript.ru/forum/images/ca_serenity/misc/logo.gif'; $testImage = exif_imagetype($addrImage); if ($testImage > 0 AND $testImage < 18) echo 'Данный файл изображение'; так можно и сделать что-бы корректно расширение создавалось, не наугад, а какое должно быть. |
laimas, спасибо, но дело в том, что это, как раз и есть анимированная картинка, поэтому ... Переформатирование картинок из png и jpg, не столь разительно в данном случае, поэтому особой роли не играет, тем более, что пользователь об этом предупрежден.
|
Цитата:
В противном случае сохраняем как GIF - file_put_contents(скачанное посредством file_get_contents). imagecreatefromstring здесь для того, чтобы отсеять мусор. Имейте ввиду и возможные большие размеры, это будет проблемой уже для file_get_contents, не говоря уже о GD. Если у вас на хосте доступен ImageMagick, то все операции лучше проделать в нем, он на гораздо большее способен, чем GD, включая и поддержку GIF анимации. GD же ее непосредственно не поддерживает, хотя можно и в нем, но писать свое уже. |
Lion777,
exif_imagetype - определяет расширение файла? |
laimas,
Спасибо, буду пробовать. |
Цитата:
imagecreatefromstring же, пытается открыть ресурс из строки, если прислали не изображение, то вернет false. |
по сигнатуре определяет тип файла, только изображения, посмотрите на php.net синтаксис.
|
laimas, вы хотите сказать, что если подделают сигнатуру, то вы взломаете сайт ?
|
Lion777,
это ничем не отличается от getimagesize в плане обдурить. |
Цитата:
|
Сервер не будут грузить такие осторожности ? )) Это так, чуть дальше от темы )), ведь об этом автор не спрашивал, ну у автора конечно то врятли, а вообще ?
|
Цитата:
|
Не получается. С самого начала, в этот код вставить,
if($im = imagecreatefromstring(file_get_contents('url'))) { } else { } а главное как узнать "узнали палитру - если truecolor"? И далее: "В противном случае сохраняем как GIF - file_put_contents(скачанное посредством file_get_contents)." <?php $file = 'https://site.ru/img/image.gif'; $current = file_get_contents($file); $current .= "imgage/1.gif"; file_put_contents($file, $current); ?> так не получается, тогда как? |
if($f = @file_get_contents('https://site.ru/img/image.gif')) { if($im = imagecreatefromstring($f)) { //это изображение imageistruecolor($im) ? imagejpeg($im, 'path/name.jpg', $quality) //сохранение JPEG/PNG -> JPEG : file_put_contents('path/name.jpg', $f); //сохранение GIF/PNG8 -> GIF imagedestroy($im); } else { //иначе мусор } } else //ошибка загрузки |
laimas,
спасибо. А переменная $quality устанавливает качество изображения? |
Анимация сохранилась в формате jpg - name.jpg Причем работает, может оставить так?
|
Цитата:
Цитата:
PS. Это file_put_contents('path/name.jpg', $f); //сохранение GIF/PNG8 -> GIF - результат моего копирования, а должно быть file_put_contents('path/name.gif', $f); В зависимости от программы просмотра/браузера, не смотря на расширение ПО покажет анимацию так как опирается не на расширение файла, а на его заголовок. |
Цитата:
Я так понимаю теперь все вшивки в exif, будут отсечены, а изменением размера можно уничтожить и в теле картинке? Но если размер изображения равен необходимому, можно это сделать двойным ресайзом, например, сначала увеличить на несколько пикселей, а потом вернуть к исходному. Или суть здесь, именно в измененном от начального размере. |
Цитата:
|
Да, и хостинг поддерживает ImageMagick, код от этого меняется?
|
Цитата:
Цитата:
Цитата:
|
Цитата:
С GD просто проще, но она и более прожорлива и уступает во многом ImageMagick, хотя для вашей задачи вполне хватит. |
Цитата:
|
Цитата:
|
дадите ссылочку на ваше творение, хочется помотреть как не будет грузить сервер
|
laimas, спасибо.
Lion777, пока некондиция. |
Sonya,
сохранение в GIF, тоже некорректно: file_put_contents('path/name.jpg', $f); //сохранение GIF/PNG8 -> GIF Если исходное, это GIF, то все будет нормально, если же PNG8, то нет. Нужно дополнительно здесь проверять тип изображения и сохранять под соответствующим расширением. |
Часовой пояс GMT +3, время: 18:48. |