【问题标题】:getimagesize() vs finfo_file() the exact same for detecting mime type?getimagesize() 与 finfo_file() 与检测 mime 类型完全相同?
【发布时间】:2015-04-24 00:50:50
【问题描述】:

这些函数是否执行相同的检查来检测文件的 MIME 类型?选择其中一个有什么好处(即可靠性/安全性方面)?

【问题讨论】:

    标签: php gd mime-types fileinfo getimagesize


    【解决方案1】:

    它们用于不同的目的,因此您可以在它们的特定范围内使用。 如果我不知道文件的来源,我更喜欢使用finfo 来检查文件的可靠性

    getimagesize — 获取图像的大小

    哪个可以为JPG APP收集元片段并假定来检测图像mime

    finfo_file — 返回有关文件的信息

    将从文件中获取元信息

    A您标记为 GD,您可能只与图像互动(?)。所以你可以使用getimagesize(),它似乎返回了独立于其扩展名的文件的mime类型,在安全性方面+1,但可能受到PHP支持的图像类型的限制。

    我的 PHP 5.6.4 有:

        [IMAGETYPE_GIF] => 1
        [IMAGETYPE_JPEG] => 2
        [IMAGETYPE_PNG] => 3
        [IMAGETYPE_SWF] => 4
        [IMAGETYPE_PSD] => 5
        [IMAGETYPE_BMP] => 6
        [IMAGETYPE_TIFF_II] => 7
        [IMAGETYPE_TIFF_MM] => 8
        [IMAGETYPE_JPC] => 9
        [IMAGETYPE_JP2] => 10
        [IMAGETYPE_JPX] => 11
        [IMAGETYPE_JB2] => 12
        [IMAGETYPE_SWC] => 13
        [IMAGETYPE_IFF] => 14
        [IMAGETYPE_WBMP] => 15
        [IMAGETYPE_JPEG2000] => 9
        [IMAGETYPE_XBM] => 16
        [IMAGETYPE_ICO] => 17
        [IMAGETYPE_UNKNOWN] => 0
        [IMAGETYPE_COUNT] => 18
    

    O另一方面,我建议您使用finfo 来获取文件的真实元信息。

    finfo 不读取除了标题之外的其他内容,getimagesize 还可以返回一些标记和额外信息(额外计算),图像特定信息。

    L检查:

    拥有这个简单的非标准功能:

    function displayInfo($path, $info = FILEINFO_MIME_TYPE ) {
    
            $imageinfo = array();
            $getimagesize = array();
    
            $finfo = new finfo($info);
            $finfo_mt = $finfo->file($path);
    
            print_r(getimagesize($path, $imageinfo));
            print_r($imageinfo);
            print_r($finfo_mt);
        }
    

    您可以使用 $info=FILEINFO_MIME 返回类型和编码,以便 安全 读取文件。所以,

    display('file.php'); 将输出

    Array
    (
    )
    text/x-php
    

    display('image.png.hide');display('image.png'); 会输出

    Array
    (
        [0] => 31
        [1] => 31
        [2] => 3
        [3] => width="31" height="31"
        [bits] => 8
        [mime] => image/png
    )
    Array
    (
    )
    image/png
    

    并且, display('image.jpg'); 会输出

    Array
    (
        [0] => 206
        [1] => 206
        [2] => 2
        [3] => width="206" height="206"
        [bits] => 8
        [channels] => 3
        [mime] => image/jpeg
    )
    Array
    (
        [APP0] => JFIF
        [APP13] => Photoshop 3.08BIMgldeLs_Kr6L1Vvu73FGOs(bFBMD01000ac1030000b1060000ad0b00006f0c0000800d0000fe11000011180000bf180000c8190000ef1a0000d2240000
        [APP2] => [REMOVED UTF CHARS FOR stackoverflow]
    )
    image/jpeg
    

    希望您的问题得到指出。

    【讨论】:

      【解决方案2】:

      嗯,基本上有两种方法可以找到文件的 mime 类型...一种是 mime_content_type,另一种是文件信息... 你可以参考下面的网址:

      http://php.net/manual/en/function.finfo-file.php

      http://php.net/manual/en/function.mime-content-type.php

      mime_content_type 现在已弃用.. 文件信息方法适用于最新的 php 版本...文件信息需要在服务器上启用文件信息扩展...

      【讨论】:

      猜你喜欢
      • 2014-09-11
      • 2016-08-18
      • 2019-03-29
      • 1970-01-01
      • 2016-02-15
      • 2011-12-16
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多