Безопасное копирование 
		
		
		
		Здравствуйте! С помощью функции 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, время: 09:10. |