【问题标题】:Is $_FILES['type'] set by client or server?$_FILES['type'] 是由客户端还是服务器设置的?
【发布时间】:2013-06-02 07:05:46
【问题描述】:

问题:

$_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 file-upload mime-types


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      文件的 mime 类型(如果浏览器提供了此信息)。 一个例子是“image/gif”。但未检查此 mime 类型 在 PHP 方面,因此不要认为它的价值是理所当然的。

      但是,正如文档和其他 cmets 在您的问题中所述,您不希望对此信息非常有信心:某些浏览器只是不填写该字段,它可能被黑客入侵等。 ..

      处理 mime 类型的可靠方法是在实际文件上传到您的服务器后对其进行检查。

      如果您想了解详细信息,这些问题已经很好地讨论了on Stack Overflow

      【讨论】:

      • +1 获取官方文档链接。 “一些浏览器只是不填写该字段”:你能说出一些你头上的名字吗?要知道将该字段留空是否是常见行为...
      • 不,我不能:常见的行为是填写字段,我从来没有遇到过浏览器不这样做......到目前为止。
      猜你喜欢
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2010-09-29
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多