64

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

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

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

4

3 回答 3

87

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)
于 2013-03-14T11:38:19.453 回答
32

获取 mimetype 的本机方式:

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

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

Whilemime_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;
}
于 2013-03-14T11:37:48.667 回答
13

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

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

于 2013-03-14T11:52:25.960 回答