PHP 文件类型检查

Posted

技术标签:

【中文标题】PHP 文件类型检查【英文标题】:PHP files type checking 【发布时间】:2011-08-02 07:54:14 【问题描述】:

当我尝试使用简单的 php 代码检查文件类型但无法通过时,出现了一些奇怪的情况。下面的代码有什么错误吗?提前致谢。

if(($_FILES["file"]["type"]!="image/jpeg")||
            ($_FILES["file"]["type"]!="image/gif")||
            ($_FILES["file"]["type"]!="image/png"))
            echo "File must be in format of jpeg,gif or png.";
        

【问题讨论】:

您的 html 表单中有 enctype="multipart/form-data" 对吗?如果是,你可以 print_r $_FILES 然后寻找@deceze给出的答案。 【参考方案1】:

我更喜欢getimagesize() 来避免 mime 类型的问题,尤其是 JPEG,其中可能有很多 mime 类型。(正如 Anomie 所写,$_FILES["file"]["type"] 是浏览器报告的类型)。

试试看,采用一些奇异的文件类型,并给它一个扩展名,如 .gif 或 .jpg。

$_FILES["file"]["type"] 将报告类似 'image.gif' 或 'image.jpeg' 的内容,但 getimagesize() 将返回 false,因为它检测到文件不是图像。

这可用于上传,例如PHP 脚本到服务器上。

另请注意:永远不要相信任何上传的文件,图像可能是正确的,但也可以在 cmets 中包含 PHP 代码。因此,请确保这些图像永远不会包含在您服务器上的任何 PHP 脚本中。(此外,您可以检查图像中的 PHP 代码)

【讨论】:

【参考方案2】:

你的条件是错误的,你想要“&&”而不是“||”。此外,$_FILES["file"]["type"] 是浏览器报告的类型,因此很可能不正确或丢失。您是否尝试过记录它以查看浏览器到底发送了什么?

使用FileInfo 等检查类型,或查看GD 或其他图像处理扩展程序是否接受它会更好。

【讨论】:

【参考方案3】:

“不是 JPEG”、“不是 GIF”、“不是 PNG”。这些条件中至少有两个必须true。由于您使用的是||,如果其中任何true,则整个if 条件是true

您正在寻找“不是JPEG并且不是GIF并且不是PNG”

除此之外,您还可以使用更简洁的形式:

!in_array($_FILES["file"]["type"], array('image/jpeg', 'image/gif', 'image/png'))

另外,$_FILES["file"]["type"] 是用户提供的信息,您不应信任。您应该尝试自己从文件本身找出 MIME 类型。例如,请参阅How to get the content-type of a file in PHP?。

【讨论】:

【参考方案4】:

mime_content_type('php.gif') 将输出图像/gif

【讨论】:

感谢提醒我使用 mime 检查的类型,因为 deceze 也提到了这一点。谢谢大家。

以上是关于PHP 文件类型检查的主要内容,如果未能解决你的问题,请参考以下文章

PHP:如何正确检查文件的 MIME 类型?

检查上传的文件是不是在 php 中属于不安全的文件类型

检查文件 mime 类型是不是与 php 中的扩展名匹配

在php中检查输入类型文件multiple是否为空

PHP:读取文件内容类型的问题

在 PHP 将文件上传到临时文件夹之前检查文件类型(FLV),方法是只读取文件的开头 3 个字节