Безопасность: Как проверить загрузку файла изображения? - PullRequest
5 голосов
/ 09 апреля 2011

Мне нужно принять загрузки файлов изображений от пользователей.

Как я могу проверить и быть на 100% уверенным, что я не получил вредоносный файл или что-то еще?

Проверьте тип пантомимы? Перерисовать изображение? Антивирусные

Ответы [ 4 ]

8 голосов
/ 09 апреля 2011

Перерисуйте изображение, прочитайте его с помощью GD imagecreatefromXXX() и сохраните его обратно с imageXXX()

Таким образом, вы также можете масштабировать его до более удобных размеров и сохранитьпотребление полосы пропускания при проверке.

Чтобы сэкономить на вычислительной мощности, запретите загрузку в файлы, размер которых превышает определенный предел.

5 или 10 мегабайт должны подойти, так как ограничения идут.

Держите GD обновленным, и будьте осторожны, что (очевидно, 7 лет назад) он использовал для предотвращения переполнения буфера при обработке изображений PNG

Кроме того, вы также можете предварительно обработать загруженные изображения в фоновом режиме с помощью таких команд, как ImageMagick * convert и т. Д.

Последнее примечание с предупреждением: в Windo (w) s convert - это также команда, используемая для форматирования жесткого диска , поэтому приложите некоторые усилия для удаления несоответствий при развертывании на этом.

1 голос
/ 09 апреля 2011

Я бы не стал 100% проверять тип изображения, я использую простой скрипт для проверки валидации типа изображения

$imgExtension = array('jpg','jpe','jpeg','gif','png');
$image_name = pathinfo($_FILES['image']['name']);
$extension = strtolower($image_name['extension']);
if(in_array($extension,$ImgExtension)){
    //process file upload - move_uploaded_file()
}

?>

Тем не менее, вы также можете проверить тип пантомимы, чтобы сделать более точную проверку.

1 голос
/ 09 апреля 2011

Если вы беспокоитесь о вредоносных файлах, используйте антивирусную проверку или, что еще лучше, две из них, поскольку одна может отставать от конкретного нового штамма.

MIME-типы могут быть подделаны, как и file.

Вы можете использовать код, чтобы открыть его, проверяя, все ли блоки имеют правильный размер, но эксплойты используют недостатки в коде, используемом для открытия изображения. Вы могли бы открыть дверь для использования на своем хосте / сервере, если ваш код не защищен и знает все способы его использования - это почти что сложная ситуация, поэтому я больше склоняюсь к доверию пары антивирусных инструментов.

0 голосов
/ 23 декабря 2013

Я не уверен, что это абсолютно безопасно, но вы могли бы использовать

if( getimagesize($filename) )
  //probably an image
...