2016-08-07 9 views
0

Мне нужно проверить, является ли загруженный файл символом типа favicon, и мне нужно сделать это безопасным способом.Как определить, является ли файл значком в PHP?

Если я загрузить FavIcon файл через входной файл и распечатать переменную $_FILES, я могу видеть, что переменная имеет следующее значение типа:

image/vnd.microsoft.icon

Я знаю, что я могу проверить, если это значение соответствует этому, но я думаю, что пользователь может его сжать. Если бы кто-нибудь мог дать мне подсказку, я был бы благодарен

+0

Используйте 'Fileinfo', чтобы получить тип mime, а затем сравните его с вашим желаемым типом mime. http://php.net/Fileinfo –

+0

Спасибо за ваш комментарий. И безопасный способ проверить это? Я хочу быть уверенным, что пользователь не вмешивается. Если это так, вы можете оставить мне свой комментарий в качестве ответа, и я пометю его как правильный ответ. @CharlotteDunois –

+2

'Функции в этом модуле пытаются угадать тип содержимого и кодировку файла, ища определенные последовательности байтов в определенных положениях в пределах файл. Хотя это не пуленепробиваемый подход, используемые эвристики выполняют очень хорошую работу. «Это намного лучше, чем полагаться на' $ _FILES [...] ['mime'] ' –

ответ

1

Если вы хотите избежать использования каких-либо внешних инструментов, https://github.com/lordelph/icofileloader обеспечивает нативный метод PHP для синтаксического анализа.ico файлы

$loader = new Elphin\IcoFileLoader\IcoFileService; 
try { 
    /** @var Elphin\IcoFileLoader\Icon $icon */ 
    $icon = $loader->fromFile('/path/to/icon.ico'); 

    //perform further inspection or render the icon as an image here... 

} catch (\Exception $e) { 
    //not an .ico file 
} 
+1

Спасибо! Работает как шарм! –

-1
  1. Используйте инструмент для преобразования вашего png в файл ico. Вы можете искать «генератор favicon», и вы можете найти множество онлайн-инструментов.
  2. Поместите ICO адрес в head с link: в тег

    <link rel="shortcut icon" href="http://sstatic.net/stackoverflow/img/favicon.ico"> 
    
+0

Это не ответ на OP вопрос и даже не пытается ответить на него. –

+0

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

2

Вы можете использовать различные инструменты:

FileInfo

Вы можете использовать FileInfo непосредственно из PHP:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
echo finfo_file($finfo, 'the_file_to_check.ico'); 
// Should print something like 'image/x-icon' 
finfo_close($finfo); 

Если в вашей системе установлено FileInfo, это, вероятно, самый простой способ.

ImageMagick

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

$ identify favicon.ico 
favicon.ico[0] ICO 16x16 16x16+0+0 32-bit sRGB 15.1KB 0.000u 0:00.000 
favicon.ico[1] ICO 32x32 32x32+0+0 32-bit sRGB 15.1KB 0.000u 0:00.000 
favicon.ico[2] ICO 48x48 48x48+0+0 32-bit sRGB 15.1KB 0.000u 0:00.000 

(вызывается из командной строки в этом примере)

Я не знаю, как FileInfo работает с ICO-файлами, но ImageMagick, вероятно, безопаснее, поскольку он действительно должен декодировать значительную часть файла.

Поскольку ImageMagick поддерживает множество форматов, важно проверить его вывод, а не просто его код возврата (ему также удается использовать JPG, SVG и т. Д.).

IcoUtils

Как легкая альтернатива ImageMagick, IcoUtils может сделать трюк:

$ icotool -l favicon.ico 
--icon --index=1 --width=16 --height=16 --bit-depth=32 --palette-size=0 
--icon --index=2 --width=32 --height=32 --bit-depth=32 --palette-size=0 
--icon --index=3 --width=48 --height=48 --bit-depth=32 --palette-size=0 

$ icotool -l not_a_favicon.svg 
favicon.svg: not an icon or cursor file (reserved non-zero) 

К сожалению, его код возврата всегда 0, заставляя вас на самом деле проверить свою продукцию.

Он может быть установлен на Ubuntu с:

sudo apt-get install icoutils