Подскажите пожалуйста, как можно обезопасить загрузку изображений, которые может загрузить пользователь на сервер (к примеру при загрузке своего аватара)? Несколько дней ломаю над этим голову... Меня больше интересует та часть защиты, которая не дает загрузить изображение, которое имеет внутри php код.
Сначала проверяешь размеры загруженного файла через getimagesize(). Если размеры выдаёт, то далее меняешь размер изображения (imagecreatetruecolor(новая_ширина, и_высота) , imagecopyresampled()). Если ошибок нет, то далее сохраняешь с правильным расширением. В новом изображении старых метаданных не будет. Вставки кода, если были, испортятся.
Социалки похоже спасаются тем, что всегда показывают "превьюшку", даже если размер оригинала нормально вписывается в нужные пределы. После imagecopyresized уже не останется никаких левых вставок.
Еще социалки сохраняют всё в jpeg, а jpeg изменяется при пережатии даже с сохранением оригинального размера.
точно. фотографы вечно ноют, что фб (вк, майлру, что угодно) портит техническое какчество их шедевров. джипег вещь одноразовая, каждая итерация обработки превращает его в еще большее уг.
Подскажите пожалуйста, как объединить первую и вторую часть кода - не пойму как после изменений залить изображение на сервер... Код (Text): if (isset ($_FILES['my_files']['name'])) { //Получаем размер и тип изображения. list($width, $height, $type_image) = getimagesize($_FILES['my_files']['tmp_name']); //Проверяем тип файла - должна быть картинка. if ($type_image > 0 AND $width > 0 AND $height > 0) { //Указываем ограничение на объем закачиваемой картинки - сейчас 300Кб. if($_FILES['my_files']['size'] < 300000) { //Начало - первая часть. $filename = $_FILES['my_files']['tmp_name']; //Задаем новую ширину и высоту изображения. $new_width = $new_height = 10; $image_p = imagecreatetruecolor($new_width, $new_height); $image = imagecreatefromjpeg($filename); imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); //Конец - первая часть. //Начало - вторая часть. $img_1 = 'G:/home/.../www/img'; $tmp_name = $_FILES['my_files']['tmp_name']; $name = 1.".jpg"; move_uploaded_file($tmp_name, "$img_emblem_clans/$name"); //Конец - вторая часть. } } else { echo "Это не изображение"; } }
Так при вышеописанной загрузке изображения на сервер пользователем не меняется у данного изображения размеры на новые (на $new_width и $new_height). Или я что-то не так понимаю?
Разобрался: вместо этого Код (Text): move_uploaded_file($tmp_name, "$img_emblem_clans/$name"); вставил вот это Код (Text): imagejpeg($image_p, "$img_emblem_clans/$name", 99); и все заработало как нужно мне. Вот полный код (предварительные проверки убрал) - работает только для jpeg. Код (Text): //Начало - первая часть. $filename = $_FILES['my_files']['tmp_name']; //Задаем новую ширину и высоту изображения. $new_width = $new_height = 50; $image_p = imagecreatetruecolor($new_width, $new_height); $image = imagecreatefromjpeg($_FILES['my_files']['tmp_name']); imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); //Конец - первая часть. //Начало - вторая часть. //Указываем полный путь к новому местоположению файла. $img_1 = '/home/.../www/img'; //Задаем новое имя изображения. $name = 1.".jpg"; //Сохраняем изображение по указанному пути и с качеством 99%. imagejpeg($image_p, "$img_1/$name", 99); //Конец - вторая часть.