За последние 24 часа нас посетили 34219 программистов и 1314 роботов. Сейчас ищут 983 программиста ...

Как сделать безопасную загрузку изображений на сервер?

Тема в разделе "Прочие вопросы по PHP", создана пользователем eldor, 22 июн 2014.

  1. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Подскажите пожалуйста, как можно обезопасить загрузку изображений, которые может загрузить пользователь на сервер (к примеру при загрузке своего аватара)? Несколько дней ломаю над этим голову... Меня больше интересует та часть защиты, которая не дает загрузить изображение, которое имеет внутри php код.
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Сначала проверяешь размеры загруженного файла через getimagesize().
    Если размеры выдаёт, то далее меняешь размер изображения (imagecreatetruecolor(новая_ширина, и_высота) , imagecopyresampled()).
    Если ошибок нет, то далее сохраняешь с правильным расширением.
    В новом изображении старых метаданных не будет. Вставки кода, если были, испортятся.
     
  3. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Спасибо, буду пробовать.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Социалки похоже спасаются тем, что всегда показывают "превьюшку", даже если размер оригинала нормально вписывается в нужные пределы. После imagecopyresized уже не останется никаких левых вставок.
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Еще социалки сохраняют всё в jpeg, а jpeg изменяется при пережатии даже с сохранением оригинального размера.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    точно. фотографы вечно ноют, что фб (вк, майлру, что угодно) портит техническое какчество их шедевров.
    джипег вещь одноразовая, каждая итерация обработки превращает его в еще большее уг.
     
  7. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Подскажите пожалуйста, как объединить первую и вторую часть кода - не пойму как после изменений залить изображение на сервер...

    Код (Text):
    1. if (isset ($_FILES['my_files']['name']))
    2.             {
    3.                 //Получаем размер и тип изображения.
    4.                 list($width, $height, $type_image) = getimagesize($_FILES['my_files']['tmp_name']);
    5.                
    6.                 //Проверяем тип файла - должна быть картинка.
    7.                 if ($type_image > 0 AND $width > 0 AND $height > 0)
    8.                 {
    9.                     //Указываем ограничение на объем закачиваемой картинки - сейчас 300Кб.
    10.                     if($_FILES['my_files']['size'] < 300000)
    11.                     {
    12.                         //Начало - первая часть.
    13.                         $filename = $_FILES['my_files']['tmp_name'];
    14.                         //Задаем новую ширину и высоту изображения.
    15.                         $new_width = $new_height = 10;
    16.                         $image_p = imagecreatetruecolor($new_width, $new_height);
    17.                         $image = imagecreatefromjpeg($filename);
    18.                         imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    19.                         //Конец - первая часть.
    20.                        
    21.                         //Начало - вторая часть.
    22.                         $img_1 = 'G:/home/.../www/img';
    23.                         $tmp_name = $_FILES['my_files']['tmp_name'];
    24.                         $name = 1.".jpg";
    25.                         move_uploaded_file($tmp_name, "$img_emblem_clans/$name");
    26.                         //Конец - вторая часть.
    27.                     }
    28.                 }
    29.                 else
    30.                 {
    31.                     echo "Это не изображение";
    32.                 }
    33.             }
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Дык это уже на сервере же ж.
     
  9. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Так при вышеописанной загрузке изображения на сервер пользователем не меняется у данного изображения размеры на новые (на $new_width и $new_height). Или я что-то не так понимаю?
     
  10. eldor

    eldor Активный пользователь

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Разобрался:
    вместо этого
    Код (Text):
    1. move_uploaded_file($tmp_name, "$img_emblem_clans/$name");
    вставил вот это
    Код (Text):
    1. imagejpeg($image_p, "$img_emblem_clans/$name", 99);
    и все заработало как нужно мне.
    Вот полный код (предварительные проверки убрал) - работает только для jpeg.
    Код (Text):
    1.  
    2.  
    3.                         //Начало - первая часть.
    4.                         $filename = $_FILES['my_files']['tmp_name'];
    5.                         //Задаем новую ширину и высоту изображения.
    6.                         $new_width = $new_height = 50;
    7.                         $image_p = imagecreatetruecolor($new_width, $new_height);
    8.                         $image = imagecreatefromjpeg($_FILES['my_files']['tmp_name']);
    9.                         imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    10.                         //Конец - первая часть.
    11.                        
    12.                        
    13.                         //Начало - вторая часть.
    14.                         //Указываем полный путь к новому местоположению файла.
    15.                         $img_1 = '/home/.../www/img';
    16.                         //Задаем новое имя изображения.
    17.                         $name = 1.".jpg";
    18.                         //Сохраняем изображение по указанному пути и с качеством 99%.
    19.                         imagejpeg($image_p, "$img_1/$name", 99);
    20.                         //Конец - вторая часть.