Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Безопасное копирование (https://javascript.ru/forum/misc/71523-bezopasnoe-kopirovanie.html)

laimas 26.11.2017 14:28

Что только GIF? А если будет не этот формат?

Sonya 26.11.2017 14:37

Пользователь может загрузить только файлы с расширением png, jpg и gif (который в приоритете), на выходе получиться только gif. Читала, что и в целях безопасности это помогает. Читала, что и использование copy, не рекомендуется, но без примеров и указания в каких именно случаях. Посчитала, что в данном случае, это приемлемо, т.к. не увидела "подводных камней" (хотя, это и не говорит о том, что их там нет).

laimas 26.11.2017 14:50

Сохранить JPEG, а тем более PNG в GIF, это урезать изображение до безобразия, да еще все и вслепую.

Если к изображению и "приклеят" непотребное, то от exif можно и избавиться, это не проблема. И сам по себе код вклеенный не выполнится, нужен "помощник".

Если загрузка по ссылке, то так (используя GD):

if($im = imagecreatefromstring(file_get_contents('url'))) {
    //обработка изображения $im, можно уменьшить его на один пиксель по ширине/высоте,
    //все что вклеили будет удалено
    //можно узнать палитру изображения, если индексированная, то сохранять в GIF
    //иначе сохранять как JPEG
    //все это функциями GD
    //стоит учесть, что если GIF анимация, то она будет утеряна, сохранится только первый ее кадр 
} else {
    //мусор
}

Lion777 26.11.2017 15:01

<?php
$addrImage = 'https://javascript.ru/forum/images/ca_serenity/misc/logo.gif';
$testImage = exif_imagetype($addrImage);
if ($testImage > 0 AND $testImage < 18) echo 'Данный файл изображение';

так можно и сделать что-бы корректно расширение создавалось, не наугад, а какое должно быть.

Sonya 26.11.2017 15:05

laimas, спасибо, но дело в том, что это, как раз и есть анимированная картинка, поэтому ... Переформатирование картинок из png и jpg, не столь разительно в данном случае, поэтому особой роли не играет, тем более, что пользователь об этом предупрежден.

laimas 26.11.2017 15:20

Цитата:

Сообщение от Sonya
это, как раз и есть анимированная картинка

Тогда не проблема, открыли изображение из строки, узнали палитру - если truecolor, значит сохранили посредством GD. Exif при этом не сохраняется, а если вклеили в тело (есть умельцы), то можно изменить размер.
В противном случае сохраняем как GIF - file_put_contents(скачанное посредством file_get_contents).

imagecreatefromstring здесь для того, чтобы отсеять мусор. Имейте ввиду и возможные большие размеры, это будет проблемой уже для file_get_contents, не говоря уже о GD.

Если у вас на хосте доступен ImageMagick, то все операции лучше проделать в нем, он на гораздо большее способен, чем GD, включая и поддержку GIF анимации. GD же ее непосредственно не поддерживает, хотя можно и в нем, но писать свое уже.

Sonya 26.11.2017 15:22

Lion777,
exif_imagetype - определяет расширение файла?

Sonya 26.11.2017 15:25

laimas,
Спасибо, буду пробовать.

laimas 26.11.2017 15:26

Цитата:

Сообщение от Sonya
определяет расширение файла?

Определяет тип файла, но не надейтесь на это, эта функция считывает начальные байты и проверяет их сигнатуру. А речь то идет о подделке.

imagecreatefromstring же, пытается открыть ресурс из строки, если прислали не изображение, то вернет false.

Lion777 26.11.2017 15:27

по сигнатуре определяет тип файла, только изображения, посмотрите на php.net синтаксис.


Часовой пояс GMT +3, время: 18:10.