$ _FILES ['type']是由客户端还是服务器设置的?

时间:2013-06-06 10:06:36

标签: php file-upload mime-types

问题:

$ _FILES [...] ['type']是直接来自客户端还是PHP / Apache设置了这个值?

为什么我要问这个:

在编写上传脚本时会弹出这个应该检查上传文件类型的内容,我已经有了检查上传文件mime类型的代码,但我是否需要该代码?

与问题相关的一些代码:

以下是我目前在上传文件验证方法中得到的内容(简化),这应该检查上传文件的类型是否真的是客户声称的类型:

// Get temporary file and mime type
$src  = $file["tmp_name"];
$mime = $file['type'];

// Get real file mime type, this does not guarantee that file is valid
$finfo = new finfo();
$file_mime = $finfo->file( $src, FILEINFO_MIME_TYPE );
unset($finfo);

// Test mime types against each other
if ($file_mime === $http_mime)
    return true;

2 个答案:

答案 0 :(得分:2)

PHP documentatio n之后,此信息来自浏览器:

  

文件的mime类型,如果浏览器提供此信息。   一个例子是“image / gif”。但是,不检查这种哑剧类型   在PHP方面,因此不要将其值视为理所当然。

但是,正如文档和您对问题的其他评论所述,您不会对此信息非常有信心:某些浏览器不会填写该字段,可能会被黑客攻击等。 ..

处理mime类型的可靠方法是在实际文件上传到服务器上后检查它们。

如果您想了解详情,我们已经很好地讨论了这些问题on Stack Overflow

答案 1 :(得分:1)

永远不要相信$ _FILES ['file'] ['type']。它接受从浏览器发送的任何内容。如果您担心安全性,请使用finfo_open验证上传文件的MIME类型。