Проверка изображений перед загрузкой на сервер

Фанат

oncle terrible
Команда форума
В этой статье меня насторожил тот момент, что можно в изображения внедрить код, который будет выполнятся на сервере
Ещё раз.
Прочти наконец первые пять абзацев.
Там написано открытым текстом, условие, при котором файл будут исполняться на сервере (совершенно очевидное впрочем. Не нужно читать никакую статью, чтобы узнать, как должен называться файл, чтобы веб-сервер исполнял его как РНР)
Потом разуть глаза, и посмотреть в свой код, выполняется ли в нем это условие.
 

Фанат

oncle terrible
Команда форума
есть еще минимум один способ,
Здравствуйте!
Я - Албанский Вирус. Но, к сожалению, из-за плохого развития высоких
технологий у нас стране, я не могу причинить никакого вреда Вашему
компьютеру. Пожалуйста, сотрите какой-нибудь важный файл у себя на
компьютере и перешлите меня кому-нибудь ещё!
 

Фанат

oncle terrible
Команда форума
Точно! Благодарю за помощь :)
Вообще в большинстве крикливых статей про безопасность почти всегда есть незаметное предложение, которое ограничивает применимость столь развесисто описанной уязвимости лабораторными условиями. Или, как здесь - все хитроумные построения разбиваются об одну строчку кода в пхп.

То же самое касается SQL инъекций. Есть миллион разных "инъекций" (на самом деле эксплойтов) с романтическими названиями - "слепая SQL инъекция", "инъекция второго порядка", "инъекция базирующаяся на времени отклика"... и все они перестают иметь хоть какое-то значение, если ты следуешь простейшим правилам защиты.

И еще по поводу файлов.
Один ушлый студент не послушал моих объяснений про эту уязвимость и стал проверять не по содержимому файла, а по сонтент-тайпу, присылаемому из браузера. А браузеры, судя по всему, определяют тип именно по расширению.
Я конечно объяснил ему в доступных выражениях, нельзя доверять что вообще ничему, приходящему с клиента, но у меня осталось впечатление, что он не очень-то мне и поверил. Стал репу чесать, как ваять мультипарт сообщение руками, но к догадался погуглить, и нашёл на редкость праильную статью - короткую, без истерик, с простым рабочим примером:
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
тема немного странная
вот есть провод, по нему ходит tcp/ip, в нем - http, с http работает php - разбирает заголовки, чтобы не писать самому их обработку

mime type - просто набор байтов, как и содержимое файла, по tcp можно отправить вообще любую последовательность байтов,
а браузер - такая же программа, как php-скрипт
отправили байты - получили байты

считать mime-type чем-то, кроме последовательности байтов - это надо быть упоротым, вроде чувака, который на самодельной ракете полетел на полтора км вверх, чтобы сфоткать землю в доказательство, что она плоская, с очевидным концом
 

max74max

Новичок
Что-то не могу понять, почему при загрузки .png на прозрачном фоне теряется прозрачность и фон становиться черным. Подскажите, пожалуйста в чем причина?
 

max74max

Новичок
Причину нашел.
PHP:
imagejpeg($final_image, $output_filename.$type, $jpeg_quality);
заменил на
PHP:
    imagepng($final_image, $output_filename.$type);
Но возникла другая проблема. Прозрачность сохраняется, но вокруг изображения (не рамки изображения) появляется черный бордер.
Оригинал Посмотреть вложение original.png

результатПосмотреть вложение bad.png
 
Последнее редактирование:

max74max

Новичок
Может проблема где-то в imagecolortransparent, после ее появляется черная обводка. А без imagecolortransparent черный фон
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
png поддерживает полупрозрачность (alpha) у тебя она потерялась после конвертации
 

max74max

Новичок
Всё получилось!
Это я убрал
PHP:
imagecolortransparent($final_image, imageColorAllocate($final_image, 0, 0, 0));
Это добавил
PHP:
    imagealphablending($resizedImage, false);
    imagesavealpha($resizedImage, true);
И код сделал таким
PHP:
   $resizedImage = imagecreatetruecolor($imgW, $imgH);
    imagealphablending($resizedImage, false);
    imagesavealpha($resizedImage, true);
    imagecopyresampled($resizedImage, $source_image, 0, 0, 0, 0, $imgW, $imgH, $imgInitW, $imgInitH);
    $rotated_image = imagerotate($resizedImage, -$angle, 0);
    $rotated_width = imagesx($rotated_image);
    $rotated_height = imagesy($rotated_image);
    $dx = $rotated_width - $imgW;
    $dy = $rotated_height - $imgH;
    $cropped_rotated_image = imagecreatetruecolor($imgW, $imgH);
    imagealphablending($cropped_rotated_image, false);
    imagesavealpha($cropped_rotated_image, true);
    imagecopyresampled($cropped_rotated_image, $rotated_image, 0, 0, $dx / 2, $dy / 2, $imgW, $imgH, $imgW, $imgH);
    $final_image = imagecreatetruecolor($cropW, $cropH);
    imagealphablending($final_image, false);
    imagesavealpha($final_image, true);
    imagecopyresampled($final_image, $cropped_rotated_image, 0, 0, $imgX1, $imgY1, $cropW, $cropH, $cropW, $cropH);
 
Сверху