我需要检查上传的文件是否为favicon类型,我需要以安全的方式进行。
如果我通过输入文件上传了一个favicon文件并打印了$_FILES
变量,我可以看到该变量具有以下类型值:
image/vnd.microsoft.icon
我知道我可以检查该值是否与之匹配,但我认为用户可以将其转储。如果有人能给我一些小费,我会很感激
答案 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)
将ico地址放在head
中link
- 标记:
<link rel="shortcut icon" href="http://sstatic.net/stackoverflow/img/favicon.ico">