Я хочу проверить свои загружаемые файлы, изображения это или нет. после поиска я нашел два способа, которые я считаю хорошим способом сделать это. первый код:
$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";
}
какой код является более надежным, чтобы проверить, что это изображения и почему? или это лучше, чем это? Благодарю.
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 (!@getimagesize($file['tmp_name'])) { //@ - for hide warning when image not valid
$error[] = "Uploaded file is not a valid image";
}
}
Почему бы не использовать 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)
С точки зрения безопасности, вы может быть лучше конвертировать загруженный файл предполагаемый чтобы быть изображением, посмотрите, добьется ли он успеха, и сохраняйте и обслуживайте преобразованный результат с этого момента.
Вы могли бы использовать один из тех imagecreatefrom...()
функции от Библиотека GD, на основе типа MIME, который вы обнаружили, например, от $_FILES
массив и / или из exif_imagetype()
, finfo_file()
и т.п.
Проблема в том, что есть некоторые эксплойты, которые притворяются действительными изображениями (а в некоторых случаях являются допустимые изображения), но также являются допустимыми JavaScript, Flash или другими контейнерами кода, которые могут запускаться браузером клиента при определенных обстоятельствах.
Смотрите также, например, https://www.defcon.org/images/defcon-15/dc15-presentations/dc-15-schrenk.pdf