Вещи, которые вы должны учитывать и остерегаться:
Расширения файлов: Веб-серверы используют расширение файлов для определения MIME-типа, отправляемого клиенту. Вы должны использовать белый список расширений, которые вы разрешаете. В вашем случае это будут расширения изображений.
LFI: Как уже упоминалось в Matchu, включение локального файла может быть проблемой. Если ваше приложение имеет динамические включения, которые позволяют вам включать произвольный файл, например. include($_GET['myfile']);
это может привести к произвольному выполнению PHP. Таким образом, вам необходимо защитить такие включения, используя basename () . Это может даже случиться с изображениями, поскольку они могут содержать встроенные комментарии.
MIME-Type-Detection: На самом деле это не очень хорошо известно, и о нем мало информации. IE <8 имеет функцию под названием MIME-Type-Detection, которая, если Content-Type не совпадает с контентом, попытается угадать тип, просматривая первые 256 байтов. Это означает, что если у вас есть файл PNG с именем image.gif с комментарием вверху, который читает <code><script>alert('hello');</script>, то IE <8 будет считать, что это HTML, и выполнить JavaScript, что приведет к атаке XSS. </p>
Чтобы предотвратить эту проблему для изображений, вы можете использовать подход, упомянутый Williham Totland. Я бы предложил использовать getimagesize () , чтобы определить, является ли изображение действительным, и убедиться, что расширение соответствует типу.
$image_filename = 'uploaded_image.gif';
$image_extension = substr(strrchr($image_filename, '.'), 1);
$mime_mapping = array('png' => 'image/png', 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg');
$info = getimagesize($image_filename);
if (!$info) {
exit('not an image');
}
if ($info['mime'] != $mime_mapping[$image_extension]) {
exit('wrong extension given');
}
// all checks passed
// image can be saved now
Об этой проблеме написана статья здесь .