php проверка на изображение

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

exif_imagetype — Определение типа изображения

Описание

exif_imagetype() считывает начальные байты изображения и проверяет их сигнатуру.

Список параметров

filename Изображение, тип которого требуется определить.

Возвращаемые значения

Список изменений

ВерсияОписание
5.3.0Добавлена поддержка иконок.

Предопределенные константы

Следующие определенные константы представляют возможные возвращаемые значения функции 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

Примеры

Пример #1 Пример использования exif_imagetype()

Смотрите также

Источник

exif_imagetype

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

exif_imagetype — Determine the type of an image

Описание

exif_imagetype() считывает начальные байты изображения и проверяет их сигнатуру.

Список параметров

filename Изображение, тип которого требуется определить.

Возвращаемые значения

Следующие определённые константы представляют возможные возвращаемые значения функции 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

Источник

Безопасная загрузка изображений на сервер. Часть первая

В данной статье демонстрируются основные уязвимости веб-приложений по загрузке файлов на сервер и способы их избежать. В статье приведены самые азы, в врят-ли она будет интересна профессионалам. Но тем неменее — это должен знать каждый PHP-разработчик.

Различные веб-приложения позволяют пользователям загружать файлы. Форумы позволяют пользователям загружать «аватары». Фотогалереи позволяют загружать фотографии. Социальные сети предоставляют возможности по загрузке изображений, видео, и т.д. Блоги позволяют загружать опять же аватарки и/или изображения.

Часто загрузка файлов без обеспечения надлежащего контроля безопасности приводит к образованию уязвимостей, которые, как показывает практика, стали настоящей проблемой в веб-приложениях на PHP.

Проводимые тесты показали, что многие веб-приложения имеют множество проблем с безопасностью. Эти «дыры» предоставляют злоумышленникам обширные возможности совершать несанкционированные действия, начиная с просмотра любого файла на сервере и закачивания выполнением произвольного кода. Эта статья рассказывает об основных «дырах» безопасности и способах их избежать.

Код примеров, приведенных в этой статье, могут быть загружены по адресу:
www.scanit.be/uploads/php-file-upload-examples.zip.

Если Вы хотите их использовать, пожалуйста удостоверьтесь, что сервер, который Вы используете, не доступен из Интернета или любых других публичных сетей. Примеры демонстрируют различные уязвимости, выполнение которых на доступном извне сервере может привести к опасным последствиям.

Обычная загрузка файла

Загрузка файлов, обычно состоит из двух независимых функций – принятие файлов от пользователя и показа файлов пользователю. Обе части могут быть источником уязвимостей. Давайте рассмотрим следующий код (upload1.php):

Обычно пользователи будут загружать файлы, используя подобную форму:

form name =»upload» action =»upload1.php» method =»POST» ENCTYPE =»multipart/form-data» >
Select the file to upload: input type =»file» name =»userfile» >
input type =»submit» name =»upload» value =»upload» >
form >

Злоумышленник данную форму использовать не будет. Он может написать небольшой Perl-скрипт (возможно на любом языке – прим. преводчика), который будет эмулировать действия пользователя по загрузке файлов, дабы изменить отправляемые данные на свое усмотрение.

В данном случае загрузка содержит большую дыру безопасности: upload1.php позволяет пользователям загружать произвольные файлы в корень сайта. Злоумышленник может загрузить PHP-файл, который позволяет выполнять произвольные команды оболочки на сервере с привилегией процесса веб-сервера. Такой скрипт называется PHP-Shell. Вот самый простой пример подобного скрипта:

Если этот скрипт находится на сервере, то можно выполнить любую команду через запрос:
server/shell.php?command=any_Unix_shell_command

Более продвинутые PHP-shell могут быть найдены в Интернете. Они могут загружать произвольные файлы, выполнять запросы SQL, и т.д.

Исходник Perl, показанный ниже, загружает PHP-Shell на сервер, используя upload1.php:

Этот скрипт использует libwwwperl, который является удобной библиотекой Perl, эмулирующей HTTP-клиента.

И вот что случится при выполнении этого скрипта:

POST /upload1.php HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: libwww-perl/5.803
Content-Length: 156
Content-Type: multipart/form-data; boundary=xYzZY
—xYzZY
Content-Disposition: form-data; name=»userfile»; filename=»shell.php»
Content-Type: text/plain

—xYzZY—

HTTP/1.1 200 OK
Date: Wed, 13 Jun 2007 12:25:32 GMT
Server: Apache
X-Powered-By: PHP/4.4.4-pl6-gentoo
Content-Length: 48
Connection: close
Content-Type: text/html
File is valid, and was successfully uploaded.

После того, как мы загрузили shell-скрипт, можно спокойно выполнить команду:

$ curl localhost/uploads/shell.php?command=id
uid=81(apache) gid=81(apache) groups=81(apache)

cURL – command-line клиент HTTP, доступный на Unix и Windows. Это очень полезный инструмент для того, чтобы проверить веб-приложения. cURL может быть загружен от curl.haxx.se

Проверка Content-Type

Приведенный выше пример редко когда имеет место. В большинстве случаев программисты используют простые проверки, чтобы пользователи загружали файлы строго определенного типа. Например, используя заголовок Content-Type:

Пример 2 (upload2.php):

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

POST /upload2.php HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: libwww-perl/5.803
Content-Type: multipart/form-data; boundary=xYzZY
Content-Length: 156
—xYzZY
Content-Disposition: form-data; name=»userfile»; filename=»shell.php»
Content-Type: text/plain

—xYzZY—

HTTP/1.1 200 OK
Date: Thu, 31 May 2007 13:54:01 GMT
Server: Apache
X-Powered-By: PHP/4.4.4-pl6-gentoo
Content-Length: 41
Connection: close
Content-Type: text/html
Sorry, we only allow uploading GIF images

Пока неплохо. К сожалению, есть способ обойти эту защиту, потому что проверяемый MIME-тип приходит вместе с запросом. В запросе выше он установлен как «text/plain» (его устанавливает браузер – прим. переводчика). Ничего не мешает злоумышленнику установить его в «image/gif», поскольку с помощью эмуляции клиента он полностью управляет запросом, который посылает (upload2.pl):

И вот что получится.

POST /upload2.php HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: libwww-perl/5.803
Content-Type: multipart/form-data; boundary=xYzZY
Content-Length: 155
—xYzZY
Content-Disposition: form-data; name=»userfile»; filename=»shell.php»
Content-Type: image/gif

—xYzZY—

В итоге, наш upload2.pl подделывает заголовок Content-Type, заставляя сервер принять файл.

Проверка содержания файла изображения

Вместо того, чтобы доверять заголовку Content-Type, разработчик PHP мог бы проверять фактическое содержание загруженного файла, чтобы удостовериться, что это действительно изображение. Функция PHP getimagesize() часто используется для этого. Она берет имя файла как аргумент и возвращает массив размеров и типа изображения. Рассмотрим пример upload3.php ниже.

Теперь, если нападавший попытается загрузить shell.php, даже если он установит заголовок Content-Type в «image/gif», то upload3.php все равно выдаст ошибку.

POST /upload3.php HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: libwww-perl/5.803
Content-Type: multipart/form-data; boundary=xYzZY
Content-Length: 155
—xYzZY
Content-Disposition: form-data; name=»userfile»; filename=»shell.php»
Content-Type: image/gif

—xYzZY—

HTTP/1.1 200 OK
Date: Thu, 31 May 2007 14:33:35 GMT
Server: Apache
X-Powered-By: PHP/4.4.4-pl6-gentoo
Content-Length: 42
Connection: close
Content-Type: text/html
Sorry, we only accept GIF and JPEG images

Можно подумать, что теперь мы можем пребывать в уверенности, что будут загружаться только файлы GIF или JPEG. К сожалению, это не так. Файл может быть действительно в формате GIF или JPEG, и в то же время PHP-скриптом. Большинство форматов изображения позволяет внести в изображение текстовые метаданные. Возможно создать совершенно корректное изображение, которое содержит некоторый код PHP в этих метаданных. Когда getimagesize() смотрит на файл, он воспримет это как корректный GIF или JPEG. Когда транслятор PHP смотрит на файл, он видит выполнимый код PHP в некотором двоичном «мусоре», который будет игнорирован. Типовой файл, названный crocus.gif содержится в примере (см. начало статьи). Подобное изображение может быть создано в любом графическом редакторе.

Итак, создадим perl-скрипт для загрузки нашей картинки:

Этот код берет файл crocus.gif и загружает это с названием crocus.php. Выполнение приведет к следующему:

Теперь нападавший может выполнить uploads/crocus.php и получить следущее:

php проверка на изображение. Смотреть фото php проверка на изображение. Смотреть картинку php проверка на изображение. Картинка про php проверка на изображение. Фото php проверка на изображение

Как видно, транслятор PHP игнорирует двоичные данные в начале изображения и выполняет последовательность » » в комментарии GIF.

Проверка расширения загружаемого файла

Читатель этой статьи мог бы задаться вопросом, почему мы просто не проверяем расширение загруженного файла? Если мы не позволим загружать файлы *.php, то сервер никогда не сможет выполнить этот файл как скрипт. Давайте рассмотрим и этот подход.

Мы можем сделать черный список расширений файла и проверить имя загружаемого файла, игнорируя загрузку файла с выполняемыми расширениями (upload4.php):

POST /upload4.php HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: libwww-perl/5.803
Content-Type: multipart/form-data; boundary=xYzZY
Content-Length: 14835
—xYzZY
Content-Disposition: form-data; name=»userfile»; filename=»crocus.php»
Content-Type: image/gif
GIF89(. skipping binary data. )
—xYzZY—

HTTP/1.1 200 OK
Date: Thu, 31 May 2007 15:19:45 GMT
Server: Apache
X-Powered-By: PHP/4.4.4-pl6-gentoo
Content-Length: 36
Connection: close
Content-Type: text/html
We do not allow uploading PHP files

POST /upload4.php HTTP/1.1
TE: deflate,gzip;q=0.3
Connection: TE, close
Host: localhost
User-Agent: libwww-perl/5.803
Content-Type: multipart/form-data; boundary=xYzZY
Content-Length: 14835
—xYzZY
Content-Disposition: form-data; name=»userfile»; filename=»crocus.gif»
Content-Type: image/gif
GIF89(. skipping binary data. )
—xYzZY—

Теперь, если мы запросим загруженный файл, то он не будет выполнен сервером:

php проверка на изображение. Смотреть фото php проверка на изображение. Смотреть картинку php проверка на изображение. Картинка про php проверка на изображение. Фото php проверка на изображение

Комментарии переводчика:
В случае загрузки картинок самым лучшим способом являются не указанные действия, а сохранение файла с расширением, которое получается в результате выполнения функции getimagesize(). В большинстве случаев именно так и происходит. Стоит добавить, что желательно сделать приведение файла к конкретному формату, например jpeg. При приведении метаданные картинки (насколько мне известно) потеряются, обеспечив практически гарантируемую безопастность.

Источник

PHP: как проверить, существует ли файл изображения?

Мне нужно увидеть, существует ли определенное изображение на моем cdn.

Я пробовал следующее, И это не работает:

даже если изображение существует или не существует, оно всегда говорит «файл существует». Я не уверен, почему это не работает.

18 ответов

вам нужно имя файла в кавычках по крайней мере (как строка):

Это не сработало для меня. Как я это сделал с помощью getimagesize.

обратите внимание, что » @ » будет означать, что если изображение не существует (в этом случае функция обычно выдает ошибку: getimagesize(http://www.mydomain.com/images/filename.png) [function.getimagesize]: failed ) он вернет false.

Ну file_exists не говорит, Существует ли файл, он говорит, если пути. ⚡⚡⚡⚡⚡⚡⚡

Итак, чтобы проверить, является ли это файл, вы должны использовать is_file вместе с file_exists чтобы узнать, действительно ли есть файл за путем, в противном случае file_exists вернутся true для любого существующего пути.

вот функция, которую я использую :

вещь, которую вы должны понять сначала:у вас нет файлов.
Файл является предметом файловой системы, но вы делаете свой запрос с использованием протокола HTTP, который поддерживает только URL-адреса.

Итак, вы должны запросить несуществующих файл с помощью браузера и посмотреть код ответа. если это не 404, вы не можете использовать какие-либо обертки, чтобы увидеть, существует ли файл, и вам нужно запросить cdn, используя какой-либо другой протокол, например FTP

вот самый простой способ проверить, существует ли файл:

Если файл находится в вашем локальном домене,вам не нужно указывать полный URL-адрес. Только путь к файлу. Если файл находится в другом каталоге, то вам необходимо в начале пути «.»

часто «.»оставлено, что приведет к тому, что файл будет показан как не существующий, когда он на самом деле делает.

is_file возвращает true для (регулярные) файлы:

возвращает правда если filename существует и является обычным файлом, FALSE иначе.

file_exists возвращает true для обоих файлов и каталогов:

возвращает правда если файл или каталог, заданный параметром filename, существует; FALSE иначе.

Примечание: проверить тоже этот вопрос stackoverflow для получения дополнительной информации по этой теме.

вы должны использовать абсолютный путь, чтобы увидеть, если файл существует.

если вы пишете для CMS или PHP framework, то, насколько я знаю, все они определили константу для корневого пути документа.

e.G WordPress использует ABSPATH, который можно использовать глобально для работы с файлами на сервере, используя ваш код, а также url-адрес сайта.

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

Стенография, если заявление объясняется:

вы можете использовать cURL. Вы можете получить cURL, чтобы дать вам только заголовки, а не тело, что может сделать его быстрее. Плохой домен всегда может занять некоторое время, потому что вы будете ждать тайм-аута запроса; вы, вероятно, можете изменить длину тайм-аута с помощью cURL.

Источник

Как проверить загруженный тип файла в PHP

я использовал этот код для проверки типа изображений,

но некоторые пользователи жалуются, что они получают ошибку при загрузке любого типа изображений, в то время как некоторые другие не получают никаких ошибок!

мне было интересно, устраняет ли это проблему:

if (mime_content_type($_FILES[‘fupload’][‘type’]) == «image/gif»)<.

8 ответов

кроме того, finfo функции отлично, если ваш сервер поддерживает их.

В дополнение к @deceze, вы можете также finfo() чтобы проверить MIME-тип файлов без изображений:

конечно, вы можете проверить, является ли это изображение с exif, но лучший способ, я думаю, это сделать с finfo так:

лучший способ, на мой взгляд, сначала использовать getimagesize() следовал по imagecreatefromstring().

проверка getimagesize() предотвращает некоторые DoS-атаки, потому что нам не нужно пытаться imagecreatefromstring() из каждого файла, предоставленного пользователем, либо файл без изображения или файл слишком большой. К сожалению, согласно PHP docs нельзя полагаться на проверку содержимого типа изображения.

на imagecreatefromstring() наконец пытается открыть файл как образ-если это удается-у нас есть образ.

в PHP 5.5 я использую эту функцию для получения типа файла и проверки изображения:

затем вы могли бы сделать:

Это просто один сценарий, который я часто использую.

в основном я использую mime_content_type (), чтобы получить что-то вроде «image/jpg», а затем взрываю его на «/» и проверяю первый элемент массива, чтобы увидеть, говорит ли он «image».

надеюсь, это сработает!

эта последняя строка близка. Вы можете использовать: if (mime_content_type($_FILES[‘fupload’][‘tmp_name’]) == «image/gif»)<.

предупреждение: следующий ответ фактически не проверяет тип файла. Он только проверяет имя. Это не подходит для фактических целей безопасности.

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

я попробовал следующее, И это сработало для меня:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *