Проверка формата изображения php

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() :

Константы 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

  1. 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 минуту
Вам в любом случае нужно делать проверку по расширению, чтобы не загрузили серверные скрипты и т.п.

Эксперт PHP

 $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>

Эксперт PHP

ЦитатаСообщение от JimUSA Посмотреть сообщение

$type = pathinfo($name, PATHINFO_EXTENSION);

ЦитатаСообщение от Jewbacabra Посмотреть сообщение

я проверяю сами «буквы» в имени файла: если буквы jpg есть в имени файла,если есть буквы gif в имени файла

сам придумал,не хочу использовать этот «filename[type]» )

Эксперт PHP

!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 Посмотреть сообщение

Спасибо, что поддержали мои слова)

ЦитатаСообщение от Зверушь Посмотреть сообщение

Эксперт PHP

ЦитатаСообщение от 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'';

Источник

Читайте также:  Throw exceptions in javascript
Оцените статью