2014-12-23 2 views
2

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

$whitelist_type = array('image/jpeg', 'image/png','image/gif'); 
$fileinfo = finfo_open(FILEINFO_MIME_TYPE); 

if (!in_array(finfo_file($fileinfo, $file['tmp_name']), $whitelist_type)) { 
$error[] = "Uploaded file is not a valid image"; 
} 

и второй код:

if (!getimagesize($_FILES['photo']['tmp_name'])) { 
$error[] = "Uploaded file is not a valid image"; 
} 

, какой код является более надежным, чтобы проверить, что это приведём изображения и почему? или это лучший способ, чем это? Благодарю.

ответ

4

finfo_* библиотека будет хорошо, но он будет работать с> = 5.3.0 версий,

И getimagesize() функции GD библиотека, которая является возвращение изображения Информация об изображении WxH и size

если изображение недействителен, то getimagesize() показать предупреждение, так лучше используйте для проверки изображения с помощью функции finfo_*,

вы также можете сделать для кода кросс-версии, см. ниже пример кода

<?php 
$file = $_FILES['photo']; 
$whitelist_type = array('image/jpeg', 'image/png','image/gif'); 
$error = null; 
if(function_exists('finfo_open')){ //(PHP >= 5.3.0, PECL fileinfo >= 0.1.0) 
    $fileinfo = finfo_open(FILEINFO_MIME_TYPE); 

    if (!in_array(finfo_file($fileinfo, $file['tmp_name']), $whitelist_type)) { 
     $error[] = "Uploaded file is not a valid image"; 
    } 
}else if(function_exists('mime_content_type')){ //supported (PHP 4 >= 4.3.0, PHP 5) 
    if (!in_array(mime_content_type($file['tmp_name']), $whitelist_type)) { 
     $error[] = "Uploaded file is not a valid image"; 
    } 
}else{ 
    if ([email protected]($file['tmp_name'])) { //@ - for hide warning when image not valid 
     $error[] = "Uploaded file is not a valid image"; 
    } 
} 
+0

Не могли бы вы объяснить, в чем польза! @ Перед getimagesize? спасибо – Kyo

+0

'@' - для скрытых предупреждений компилятора, когда изображение недействительно – Girish

+0

'} else {' case, вероятно, никогда не используется, но вы можете добавить для безопасного кода, – Girish

2

Почему бы не использовать exif_imagetype:

if (exif_imagetype($file['tmp_name']) != (IMAGETYPE_JPEG || IMAGETYPE_GIF || IMAGETYPE_PNG)) { 
    $error[] = "Uploaded file is not a valid image"; 
} 

Это, вероятно, будет быстрее, чем любой из других. (PHP 4> = 4.3.0, PHP 5)

+0

более надежно? я предпочитаю выбирать безопасность, а не производительность, так как я собираюсь использовать ее в небольшом проекте. – Kyo

+0

Я думаю, что он окажется самым надежным, так как он использует встроенные функции PHP; Он также специально считывает подпись файлов для проверки типа. Это не значит, что тип файлов mime нельзя подделать, однако нет никакой функции, которая может полностью предотвратить это. Если вы правильно обрабатываете свои изображения, хотя угроза того, что кто-то может использовать поддельное изображение в качестве вектора атаки, не должен быть основной причиной для беспокойства. –

+0

Может быть, я должен использовать эту опцию тоже рядом с моей другой проверкой на всякий случай.Я прочитал статью о том, что хакер все еще может сделать допустимый тип файла и содержать какой-то код внутри. Мне интересно, как ответить @Archimedix, что мы должны преобразовывать изображения с помощью imagecreatefrom ...(), мне интересно, может ли он перезаписать код внутри изображения файл. – Kyo

1

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

Вы можете использовать одну из этих функций imagecreatefrom...() из GD library на основе обнаруженного вами типа MIME, например. от $_FILES массива, и/или из exif_imagetype(), finfo_file() и т.д.

Проблема в том, что есть некоторые эксплойты там, претендующих на действительные изображения (а в некоторых случаях являются действительные изображения), но также действительны JavaScript , Flash или другие контейнеры кода, которые могут выполняться браузером клиента при определенных обстоятельствах.

См. Также, например, https://www.defcon.org/images/defcon-15/dc15-presentations/dc-15-schrenk.pdf

+0

, так что это imagecreatefrom может предотвратить php или другой скрипт, который кажется быть действительными изображениями и проходить выше проверки? – Kyo

+2

Что я имел в виду, так это то, что вы должны воссоздать изображение и сохранить восстановленное изображение вместо загруженного файла, поскольку оно может удалить вредоносные данные при загрузке. Воссоздание также может удалить данные EXIF, такие как геолокация, что пользователи часто не хотят быть общедоступными для других людей (она рассказывает всем, где была сделана фотография. Если это было дома, люди знают, где вы живете). – Archimedix

Смежные вопросы