PHP检查文件是否是图像

sf8*_*f89 44 php file-upload image getimagesize

有没有办法确保收到的文件是图像PHP

测试扩展对我来说听起来不太安全,因为您可以上传script并将其扩展名更改为您想要的任何内容.

我也试过使用getimagesize,但可能有更适合那个特定问题的东西.

小智 68

和getimagesize()应制定文件是否是一个图像的最明确的方式:

if(@is_array(getimagesize($mediapath))){
    $image = true;
} else {
    $image = false;
}
Run Code Online (Sandbox Code Playgroud)

因为这是一个示例getimagesize()输出:

Array (
[0] => 800
[1] => 450
[2] => 2
[3] => width="800" height="450"
[bits] => 8
[channels] => 3
[mime] => image/jpeg)
Run Code Online (Sandbox Code Playgroud)

  • 既然`getimagesize`在失败时返回false,那么这可以减少到`$ image = getimagesize($ mediapath)?true:false;` (16认同)
  • PHP官方文档建议不要使用此https://secure.php.net/manual/en/function.getimagesize.php (15认同)
  • `getimagesize()`慢得多.最好使用[exif_imagetype()](http://www.php.net/manual/en/function.exif-imagetype.php) (3认同)

Dea*_*Man 21

获取mimetype的本地方式:

对于PHP <5.3,使用mime_content_type()
对于PHP> = 5.3,使用finfo_open()mime_content_type()

获取MimeType的替代方法是exif_imagetypegetimagesize,但这些依赖于安装了适当的库.此外,他们可能只返回图像mimetypes,而不是magic.mime中给出的整个列表.

虽然mime_content_type可以从PHP 4.3获得,但它是FileInfo扩展的一部分(默认情况下从PHP 5.3开始启用,除了Windows平台,必须手动启用它,详情请参见此处).

如果您不想打扰系统上的可用内容,只需将所有四个函数包装到一个代理方法中,该方法将函数调用委托给任何可用的函数,例如

function getMimeType($filename)
{
    $mimetype = false;
    if(function_exists('finfo_open')) {
        // open with FileInfo
    } elseif(function_exists('getimagesize')) {
        // open with GD
    } elseif(function_exists('exif_imagetype')) {
       // open with EXIF
    } elseif(function_exists('mime_content_type')) {
       $mimetype = mime_content_type($filename);
    }
    return $mimetype;
}
Run Code Online (Sandbox Code Playgroud)

  • `finfo_fopen`,`getimagesize`,`exif_imagetype`,`mime_content_type`不完全安全..我拿了一个html代码保存为png图像..之后我在客户端和服务器端使用filereader Api上传到服务器上面写的函数. (2认同)
  • `finfo_fopen()`应该是`finfo_open()` - 在`open`之前没有`f`."虽然从PHP5.3中删除了"mime_content_type`" - 但我认为它并未被"删除".它确实被(暂时)弃用,正如许多评论所暗示的那样,尽管在文档中没有提到这一点.`mime_content_type()`是[Fileinfo扩展](http://php.net/manual/en/fileinfo.installation.php)的一部分,默认情况下在PHP 5.3+上启用(除非你在Windows上,当你必须启用它) (2认同)

小智 9

使用文件扩展名和getimagesize函数来检测上传文件是否具有正确的格式只是入门级检查,它可以通过上传具有真正扩展名的文件和图像标题的某个字节但是内容错误来绕过.

为了安全和安全,您可以对上传的图片进行缩略图/调整大小(即使使用原始图像大小),并保存此版本而不是上传的版本.还可以获取上传的文件内容并搜索特殊字符,例如<?php找到文件是否为图像.