Ограничение загрузки файлов определенного типа

#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 . Это безопасный метод, поскольку он фактически проверяет содержимое файла.