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

如何在PHP中检测文件是否为favicon?,php,file-upload,favicon,ico,Php,File Upload,Favicon,Ico,我需要检查上传的文件是否为favicon类型,我需要以安全的方式执行 如果通过输入文件上载favicon文件并打印$\u FILES变量,我可以看到该变量具有以下类型值: image/vnd.microsoft.icon 我知道我可以检查这个值是否匹配,但我认为用户可以转储它。如果有人能给我一些小费,我将不胜感激 使用工具将png转换为ico文件。你可以搜索“favicon生成器”,你可以找到许多在线工具 使用链接-标记将ico地址放入标题: <link rel="shortcut ico

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

如果通过输入文件上载favicon文件并打印
$\u FILES
变量,我可以看到该变量具有以下类型值:

image/vnd.microsoft.icon

我知道我可以检查这个值是否匹配,但我认为用户可以转储它。如果有人能给我一些小费,我将不胜感激

  • 使用工具将png转换为ico文件。你可以搜索“favicon生成器”,你可以找到许多在线工具
  • 使用
    链接
    -标记将ico地址放入
    标题

    <link rel="shortcut icon" href="http://sstatic.net/stackoverflow/img/favicon.ico">
    
    
    
  • 使用工具将png转换为ico文件。你可以搜索“favicon生成器”,你可以找到许多在线工具
  • 使用
    链接
    -标记将ico地址放入
    标题

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

  • 您可以使用各种工具:

    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的轻量级替代品,iCutils可以实现以下功能:

    $ 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
    

    您可以使用各种工具:

    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的轻量级替代品,iCutils可以实现以下功能:

    $ 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
    

    如果您希望避免使用任何外部工具,请提供一个用于解析.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
    }
    

    如果您希望避免使用任何外部工具,请提供一个用于解析.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
    }
    

    使用
    Fileinfo
    获取mime类型,然后将其与所需的mime类型进行比较。谢谢你的评论。这是一种安全的检查方式吗?我想确保用户不会篡改它。如果是这样,您可以将您的评论作为答案留给我,我会将其标记为right answer@CharlotteDunois
    此模块中的函数通过查找文件中特定位置的某些魔法字节序列来尝试猜测文件的内容类型和编码。虽然这不是一种防弹的方法,但使用的启发式方法做得很好。
    这比依赖
    $\u文件[…]['mime']
    使用
    Fileinfo
    获得mime类型,然后将其与所需的mime类型进行比较要好得多。谢谢你的评论。这是一种安全的检查方式吗?我想确保用户不会篡改它。如果是这样,您可以将您的评论作为答案留给我,我会将其标记为right answer@CharlotteDunois
    此模块中的函数通过查找文件中特定位置的某些魔法字节序列来尝试猜测文件的内容类型和编码。虽然这不是一种防弹的方法,但使用的启发式方法做得很好。
    这比依赖
    $\u文件[…]['mime'].
    要好得多。这不是对OP问题的回答,甚至没有试图回答它。对不起,我不是在问这个问题。我问的是如何通过表单检测文件是否为favicon,这不是对OP问题的回答,甚至没有尝试回答。对不起,我不是在问这个问题。我在问如何通过表单检测文件是否安全谢谢!工作起来很有魅力!谢谢工作起来很有魅力!