$_FILES['type'] 是否由客户端或服务器设置


Is $_FILES['type'] set by client or server?

问题:

$_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;

在 PHP 文档之后,此信息来自浏览器:

文件的 mime 类型(如果浏览器提供了此信息(。 一个例子是"图像/gif"。但是,未选中此哑剧类型 在PHP方面,因此不要将其价值视为理所当然。

但是,正如文档和对您的问题的其他评论所述,您不想对这些信息非常有信心:某些浏览器只是不填写字段,它可能被黑客入侵等......

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

如果你想

了解细节,这些问题已经在Stack Overflow上得到了很好的讨论。

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