Мне нужно принять загрузки файлов изображений у пользователей.
Как я могу проверить и быть на 100% уверенным, что у меня нет вредоносного файла или чего-то еще?
Проверьте тип mime? Повторно нарисовать изображение? Антивирусные?
Перерисуйте изображение, прочитайте его с помощью функции imageXXX()
imagecreatefromXXX()
и сохраните его с помощью imageXXX()
Таким образом, вы можете также масштабировать его до более удобных размеров и контролировать пропускную способность.
Чтобы сэкономить на вычислительной мощности, запретите загружать файлы, превышающие определенный предел.
5megs или 10megs должны быть хорошими, поскольку ограничения идут.
Держите GD обновленным и будьте осторожны (7 лет назад, по-видимому) он использовал для переполнения буфера в обработке изображений PNG
Кроме того, вы можете также предварительно обработать загруженные изображения в фоновом режиме с помощью таких команд, как
convert
ImageMagick и т. Д.Последняя записка о предупреждении: на Windo (w) s
convert
также используется команда для форматирования жесткого диска , поэтому приложите некоторые усилия для устранения непоследовательности, если вы развернете ее.
Если вас беспокоят вредоносные файлы, используйте антивирусную проверку или, еще лучше, две из них, поскольку может быть отставание от определенного нового штамма.
MIME-типы могут быть подделаны, а также могут использоваться file
.
Вы можете использовать код, чтобы открыть его, проверяя, соответствуют ли все блоки правильным размерам, но эксплоиты используют недостатки в коде, используемом для открытия изображения. Вы можете открыть дверь для использования на своем хосте / сервере, если ваш код не затвердеет и не знает о всех способах его использования – это почти ситуация с курицей и яйцом, поэтому я склоняюсь к тому, чтобы больше доверять пару антивирусных инструментов.
Я бы не пошел на проверку качества изображения на 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() }
?>
Тем не менее вы также можете проверить тип mime для более точной проверки.
Я не уверен, что это абсолютно безопасно, но вы можете использовать
if( getimagesize($filename) ) //probably an image