【问题标题】:PHP check if file is an image [duplicate]PHP检查文件是否是图像[重复]
【发布时间】:2013-03-02 17:37:25
【问题描述】:

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

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

我也尝试使用getimagesize,但可能有更适合该特定问题的东西。

【问题讨论】:

标签: php image file-upload getimagesize


【解决方案1】:

获取 mimetype 的原生方式:

对于 PHP 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 平台除外,它必须手动启用,详情请参阅 here)。

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

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

【讨论】:

  • 不幸的是,这似乎已被弃用。
  • 我刚刚更新了我的答案。你可以试试这个
  • finfo_fopen, getimagesize, exif_imagetype, mime_content_type 不完全安全..我拿了一个html代码并保存为png图像..之后我使用filereader Api上传到服务器在客户端和服务器端使用上面写的函数。
  • finfo_fopen() 应该是finfo_open() - 在open 之前没有f。 “虽然 mime_content_type 已从 PHP5.3 中删除” - 我认为它从未被“删除”。正如许多 cmets 所暗示的那样,它似乎(暂时)被弃用了,尽管文档中不再提及这一点。 mime_content_type()Fileinfo extension 的一部分,在 PHP 5.3+ 上默认启用(除非你在 Windows 上,当你必须启用它时)
  • 2018 年 PHP 文档:mime_content_type (PHP 4 >= 4.3.0, PHP 5, PHP 7),没有任何“弃用”之类的标记...
【解决方案2】:

getimagesize() 应该是确定文件是否为图像的最明确方法:

if(@is_array(getimagesize($mediapath))){
    $image = true;
} else {
    $image = false;
}

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

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

【讨论】:

  • 由于getimagesize在失败时返回false,这可以缩减为$image = getimagesize($mediapath) ? true : false;
  • if($array = getimagesize($mediapath)) { // true and use the $array if required }
  • 感谢您的解决方案。我认为在这种情况下不需要将 @ 放在 is_array 之前。
  • getimagesize() 慢得多。最好使用exif_imagetype()
  • PHP 官方文档建议不要这样做secure.php.net/manual/en/function.getimagesize.php
【解决方案3】:

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

为了安全起见,您可以为上传的图片制作缩略图/调整大小(即使是原始图片大小)并保存此版本而不是上传的图片。 还可以获取上传的文件内容并搜索特殊字符,如<?php 以查找文件是否为图像。

【讨论】:

  • 是不是有点重?不过我会调查的。
猜你喜欢
  • 2013-08-15
  • 2014-11-25
  • 2017-06-11
  • 2013-05-05
  • 1970-01-01
  • 2011-10-02
  • 2014-03-11
  • 2011-01-12
  • 2016-10-06
相关资源
最近更新 更多