#php
#php
Вопрос:
Я создаю скрипт загрузки файлов, который разрешает только jpg.
Скрипт, который я использую для проверки, является
$size = getimagesize($filename);
$size['mime'];
Это работает в большинстве случаев. Однако, если у меня есть файл «gif», и я переименовал расширение в «jpg», это вводит систему в заблуждение, поскольку mime-тип для этого файла отображается как jpg.
Как я могу это предотвратить?
Итак, разрешены jpg и png, Gif запрещен
Ответ №1:
Вместо $size['mime']
(который, как вы поняли, является MIME-типом и, следовательно, не совсем надежным), используйте $size[2]
.
В ручном вводе говорится, что он содержит
одна из констант IMAGETYPE_XXX, указывающая тип изображения.
В комментарии ниже по странице удобно перечислены эти константы:
1 = GIF
2 = JPG
3 = PNG
4 = SWF
5 = PSD
6 = BMP
7 = TIFF (Intel byte order)
8 = TIFF (Motorola byte order)
9 = JPC
10 = JP2
11 = JPX
12 = JB2
13 = SWC
14 = IFF
15 = WBMP
16 = XBM
Эта информация генерируется путем изучения самого файла и, как таковая, является наиболее надежным механизмом в вашем распоряжении.
Комментарии:
1. @leonbloy: Ага, вот оно! Спасибо.
Ответ №2:
Однако, если у меня есть файл «gif», и я переименовал расширение в «jpg», это вводит систему в заблуждение, поскольку mime-тип для этого файла отображается как jpg.
Извлеките базовое имя файла (без расширения) с помощью pathinfo()
:
$file =
pathinfo("myFakeGifImage.jpg", PATHINFO_BASENAME); // returns myFakeGifImage
и добавьте расширение, основанное на типе файла, который getimagesize()
возвращает, а не на том, что сообщает вам пользователь.
Комментарии:
1. Я не понимаю, чего добьется удаление расширения, кроме того, что
$file
переменная станет бесполезной для фактического доступа к файлу.
Ответ №3:
Если вам нужны только файлы jpeg, загрузите его с помощью imagecreatefromjpeg, который возвращает FALSE при ошибках для поддельных файлов jpeg.
Ответ №4:
PHP также способен определять MIME-тип файла, т.е. с помощью mime_content_type
. Это безопасный метод, поскольку он фактически проверяет содержимое файла.