如何检测文件是否是PHP中的favicon?

时间:2016-08-07 15:07:28

标签: php file-upload favicon ico

我需要检查上传的文件是否为favicon类型,我需要以安全的方式进行。

如果我通过输入文件上传了一个favicon文件并打印了$_FILES变量,我可以看到该变量具有以下类型值:

image/vnd.microsoft.icon

我知道我可以检查该值是否与之匹配,但我认为用户可以将其转储。如果有人能给我一些小费,我会很感激

3 个答案:

答案 0 :(得分:2)

您可以使用各种工具:

<强>的FileInfo

您可以直接从PHP使用FileInfo

$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

答案 1 :(得分:1)

如果您想避免使用任何外部工具,https://github.com/lordelph/icofileloader提供了解析.ico文件的本机PHP方法

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

答案 2 :(得分:-1)

  1. 使用工具将您的png转换为ico文件。您可以搜索“favicon生成器”,您可以找到许多在线工具。
  2. 将ico地址放在headlink - 标记:

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