exif_imagetype
exif_imagetype() читает первые байты изображения и проверяет его подпись. Если корректная подпись найдена, возвращается константа, иначе возвращается FALSE. Возвращается то же значение, что и из getimagesize() в индексе 2, но эта функция работает намного быстрее.
exif_imagetype() может использоваться для исключения других exif-функций с неподдерживаемыми типами файлов или в сочетании с $_SERVER[‘HTTP_ACCEPT’] для проверки того, может ли зритель видеть данное конкретное изображение в своём браузере.
Если корректная подпись найдена, возвращается константа, иначе возвращается FALSE. Возвращается то же значение, что и из getimagesize() в индексе 2, но эта функция работает намного быстрее.
Определены следующие константы:
1 = IMAGETYPE_GIF
2 = IMAGETYPE_JPG
3 = IMAGETYPE_PNG
4 = IMAGETYPE_SWF
5 = IMAGETYPE_PSD
6 = IMAGETYPE_BMP
7 = IMAGETYPE_TIFF_II (intel byte order)
8 = IMAGETYPE_TIFF_MM (motorola byte order)
9 = IMAGETYPE_JPC
10 = IMAGETYPE_JP2
11 = IMAGETYPE_JPX
12 = IMAGETYPE_JB2
13 = IMAGETYPE_SWC
14 = IMAGETYPE_IFF
15 = IMAGETYPE_WBMP
16 = IMAGETYPE_XBM
Пример 1. exif_imagetype()
if (exif_imagetype('image.gif') != IMAGETYPE_GIF)
Примечание: Эта функция доступна только в PHP >= 4, скомпилированном с --enable-exif.
Эта функция не требует наличия библиотеки GD image.
exif_imagetype
exif_imagetype() считывает начальные байты изображения и проверяет их сигнатуру.
exif_imagetype() может использоваться, чтобы избежать вызовов других exif-функций с неподдерживаемыми аргументами. Также при взаимодействии с $_SERVER[‘HTTP_ACCEPT’] можно проверять, будет ли изображение отображаться в браузере.
Список параметров
filename Изображение, тип которого требуется определить.
Возвращаемые значения
Если корректная сигнатура обнаружена, функция вернёт соответствующую типу изображения константу. В противном случае функция вернёт false . Возвращаемое значение то же, что и во втором аргументе при возврате из функции getimagesize() , однако exif_imagetype() значительно быстрее.
Следующие определённые константы представляют возможные возвращаемые значения функции exif_imagetype() :
Значение | Константа |
---|---|
1 | IMAGETYPE_GIF |
2 | IMAGETYPE_JPEG |
3 | IMAGETYPE_PNG |
4 | IMAGETYPE_SWF |
5 | IMAGETYPE_PSD |
6 | IMAGETYPE_BMP |
7 | IMAGETYPE_TIFF_II (порядок байт intel) |
8 | IMAGETYPE_TIFF_MM (порядок байт motorola) |
9 | IMAGETYPE_JPC |
10 | IMAGETYPE_JP2 |
11 | IMAGETYPE_JPX |
12 | IMAGETYPE_JB2 |
13 | IMAGETYPE_SWC |
14 | IMAGETYPE_IFF |
15 | IMAGETYPE_WBMP |
16 | IMAGETYPE_XBM |
17 | IMAGETYPE_ICO |
18 | IMAGETYPE_WEBP |
Замечание:
В случаях, когда невозможно считать количество байтов из файла достаточное для определения типа изображения, функция exif_imagetype() вызовет предупреждение уровня E_NOTICE и вернёт false .
Список изменений
Версия | Описание |
---|---|
7.1.0 | Добавлена поддержка WebP. |
PHP best way to check if file is an image
The getimagesize function of php provides lot of information about an image file , including its type. The type can be used to check if the file is a valid image file or not.
To check if a file is an image or not, use the function
function is_image($path) < $a = getimagesize($path); $image_type = $a[2]; if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP))) < return true; >return false; >
$a[0] and $a[1] are the width and height of the image.
$a[2] has the image type.
Other image formats include :
[IMAGETYPE_GIF] => 1 [IMAGETYPE_JPEG] => 2 [IMAGETYPE_PNG] => 3 [IMAGETYPE_SWF] => 4 [IMAGETYPE_PSD] => 5 [IMAGETYPE_BMP] => 6 [IMAGETYPE_TIFF_II] => 7 [IMAGETYPE_TIFF_MM] => 8 [IMAGETYPE_JPC] => 9 [IMAGETYPE_JP2] => 10 [IMAGETYPE_JPX] => 11 [IMAGETYPE_JB2] => 12 [IMAGETYPE_SWC] => 13 [IMAGETYPE_IFF] => 14 [IMAGETYPE_WBMP] => 15 [IMAGETYPE_JPEG2000] => 9 [IMAGETYPE_XBM] => 16 [IMAGETYPE_ICO] => 17 [IMAGETYPE_UNKNOWN] => 0 [IMAGETYPE_COUNT] => 18
1. mpeg videos are detected as IMAGETYPE_ICO !!
A Tech Enthusiast, Blogger, Linux Fan and a Software Developer. Writes about Computer hardware, Linux and Open Source software and coding in Python, Php and Javascript. He can be reached at [email protected] .
7 Comments
- Vladimir December 14, 2017 at 11:11 pm Link: “http://php.net/manual/en/function.getimagesize.php”.
Quote: “Do not use getimagesize() to check that a given file is a valid image. Use a purpose-built solution such as the Fileinfo extension instead”.
Link to description of that extension: “http://php.net/manual/ru/book.fileinfo.php”.
Как узнать файл это картинка или нет
делаю загрузку файлов, есть вариант, но столкнулся с проблемой, файл картинка не показывает тип $_FILES[‘userfile’][‘type’] вообще. Может у кого есть другие решения?
if(($_FILES['userfile']['type'] == 'image/jpg' || $_FILES['userfile']['type'] == 'image/gif' || $_FILES['userfile']['type'] == 'image/jpeg' || $_FILES['userfile']['type'] == 'image/png') && ($_FILES['userfile']['size'] != 0 and $_FILES['userfile']['size']8388608))
Как осуществлять проверку на то, картинка это или нет ?
Как осуществлять проверку на то, картинка это или нет, и если не картинка то вывести ошибку.
Как узнать ссылка это или файл из командной строки
Что такое символическая, жёсткая и т.д. ссылка объяснять не надо, как создаётся, какими утилитами.
Как узнать является файл каталогом или нет?
Подскажите как узнать является ли файл каталогом или нет. через FindFirstFile() и FindNextFile().
Как узнать, скачался файл из Интернета или нет?
Как узнать, скачался ли файл из Интернета или нет?
Добавлено через 1 минуту
Вам в любом случае нужно делать проверку по расширению, чтобы не загрузили серверные скрипты и т.п.
$info = new \finfo(FILEINFO_MIME_TYPE); $mime = $info->file(__FILE__); list($type, $subtype) = explode('/', $mime, 2); var_dump($mime, $type, $subtype);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
header("Content-Type: text/html;charset=windows-1251"); $up_exp = array('png', 'jpg', 'gif'); if($_SERVER['REQUEST_METHOD'] === 'POST') { try { $file = $_FILES['file']; $name = $file['name']; $type = strtolower(end(explode('.', $name))); if(!in_array($type, $up_exp)) throw new Exception('Вы пытаетесь загрузить недоступный формат!'); echo 'Файл успешно прошел проверку!'; }catch(Exception $e) { echo 'Error: '
. $e->getMessage() . ''; } } ?> form action="" method="POST" enctype="multipart/form-data"> input type="file" name="file" /> br /> button>Uploadbutton> form>
Сообщение от JimUSA
$type = pathinfo($name, PATHINFO_EXTENSION);
Сообщение от Jewbacabra
я проверяю сами «буквы» в имени файла: если буквы jpg есть в имени файла,если есть буквы gif в имени файла
сам придумал,не хочу использовать этот «filename[type]» )
!preg_match('/mp3/',$u->file['name']) & !preg_match('/wav/',$u->file['name']) & !preg_match('/m4a/',$u->file['name']) & !preg_match('/gif/',$u->file['name']) & !preg_match('/png/',$u->file['name']) & !preg_match('/JPG/',$u->file['name']) & !preg_match('/jpg/',$u->file['name']) & !preg_match('/jpeg/',$u->file['name']) & !preg_match('/flv/',$u->file['name']) & !preg_match('/mp4/',$u->file['name']) & !preg_match('/avi/',$u->file['name']
!preg_match('/.+\.(mp3|wav|m4a|и т.д)$/', $u->file['name']);
Использовать проверку вхождения ключевого слова расширение файла — плохая практика. Как написано выше — проверять MIME type файла
Сообщение от JimUSA
Залить вредоносный скрипт под «проверяемым» расширением не составит труда. Речь идет о безопасности ресурса, а быть может и всего сервера хостинга где крутится первый.
nobodyvlv, вы не совсем правы. Сам MIME-тип часто определяется по расширению, так что это вас не спасет.
Добавлено через 1 минуту
Сообщение от nobodyvlv
Сообщение от miketomlin
nobodyvlv, вы не совсем правы. Сам MIME-тип часто определяется по расширению, так что это вас не спасет.
Сменить вручную расширение, залить какой-то шелл и выполнить — вот цена проверки по расширению. Конкретно тот класс finfo_file() судя по документации читает байт массив заголовка файла и по нему определяет тип содержимого, а не по расширению. Это не раз разжовывалось и на форумах, и на хабре, и на stackoverflow — я просто не буду повторяться и пересказывать уже сказанные вещи. Да, может и не выполниться, но это при условии выставленных прав.
Вот выше человек тоже замечательную функцию предложил exif_imagetype() для заливаемых изображений.
Можно поступать иначе, если взять в рассчет «магические числа» https://en.wikipedia.org/wiki/. gic_number. Прочесть первые несколько байт и проверить по таблице нужные форматы https://en.wikipedia.org/wiki/. signatures. Но как по мне это садомазо, но имеет место жить и оно))
Не проверяйте по расширению. Я легко создам php файл с вредоносным кодом cool_image.png и залью его на сайт в этом случае. А потом у вас на сайте будет выводится такой html:
img src="uploads/cool_image.png" />
Скрипт мне на почту сольет всю вашу базу данных. А еще лучше удалит ее, чтобы никогда больше так не делали
И самое интересное, в конец файла я запихну такой код:
1 2 3 4 5 6 7 8 9 10 11 12 13
$img = imagecreatetruecolor(1, 1); $bg = imagecolorallocate($img, 255, 0, 255); imagecolortransparent($img, $bg); imagefilledrectangle($img, 0, 0, 1, 1, $bg); header('Content-Type: image/png'); header("Expires: Thu, 19 Feb 1998 13:24:18 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Cache-Control: post-check=0,pre-check=0"); header("Cache-Control: max-age=0"); header("Pragma: no-cache"); echo imagepng($img); exit();
Для пользователя и правда будет загружаться картинка Никто ничего не заметит.
Добавлено через 6 минут
И если логин и пароль от БД получить не удастся (обычно они хранятся в одном из файлов), то можно со злости грохнуть все файлы
Сообщение от miketomlin
Сообщение от nobodyvlv
Спасибо, что поддержали мои слова)
Сообщение от Зверушь
Сообщение от mozg-bolit
Почему картинка выдает ошибку, я её как то не правильно переименовываю, почему картинка не показывается ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
if (exif_imagetype($_FILES['uploadfile']['tmp_name']) != IMAGETYPE_GIF and exif_imagetype($_FILES['uploadfile']['tmp_name']) != IMAGETYPE_JPEG and exif_imagetype($_FILES['uploadfile']['tmp_name']) != IMAGETYPE_PNG) { echo 'Для загрузки доступны только картинки формата GIF,JPEG и PNG'; exit; } //папка для загрузки $uploaddir = 'download/'.$_SESSION['id'].'/'; //новое сгенерированное имя файла $newFileName='1.png'; //путь к файлу (папка.файл) $uploadfile = $uploaddir.$newFileName; //загружаем файл move_uploaded_file if (move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $uploadfile)) echo "Выбранный файл загружен.\n"; else echo "Ошибка загрузки файла.\n"; //считываем содержания файла $fp = fopen($uploadfile, 'r'); $contents = fread($fp, filesize ($uploadfile)); fclose($fp); //чистим от php и html дескрипторов $contents = strip_tags($contents); $fp = fopen($uploadfile, 'w'); fwrite($fp, $contents); fclose($fp); echo'';