2

我想检查上传文件类型,请告诉我在哪里可靠,在这种情况下获得我更准确的文件类型信息?在这:

$_files['uploaded_file']['type']

或者在这个:

$imgType = getimagesize($_files['uploaded_file']['tmp_name']);
$imgType['mime'];

?

4

6 回答 6

6

$_FILES['uploaded_file']['type']是用户输入 - 它是客户端定义的任意字符串。因此,使用任何东西都是不安全的,永远。

getimagesize()是一种更安全的方法,但它并不能完全保护您。

您还需要:

  • 使用完全由您自己设计的名称将文件存储在本地服务器上。依赖任何用户输入来生成本地文件系统文件名是不安全的。
  • 使用 GD 将像素数据从源文件复制到目标文件。getimagesize()只查看与文件关联的元数据,不查看文件数据。可以将恶意代码隐藏在看起来像图像的东西中。重新采样图像后,请确保从服务器中删除上传的文件。
  • 确保文件存储在具有最低要求权限和限制性所有者/组的本地文件系统中。
于 2012-09-04T10:59:27.133 回答
3

$_FILES[...]['type']永远不可靠,它是用户提供的任意值。getimagesize,exif_imagetypefinfo是检查您所拥有内容的首选方法。另请参阅上传的安全威胁

于 2012-09-04T10:57:35.107 回答
2

我相信getimagesize

因为任何人都可以编辑上传的文件类型使用任何 HTTP/HTTPS 标头,例如在 firefox 中篡改数据插件

于 2012-09-04T10:59:06.937 回答
1

在实践中,您可能应该使用图像附带的元数据 ( $_files['uploaded_file']['type']),但是这可能在上传之前被篡改。

如果您只是在尺寸之后,请使用它,因为它比实际测量图像更快getimagesize。但是,如果您需要文件类型信息,最好检查文件“所说”之外的内容,因为通过幼稚的检查很容易潜入可执行文件。

于 2012-09-04T10:58:28.870 回答
1

Usinggetimagesize()将为您提供更一致的 mime 信息,因为它使用mime-type文件的环境定义(GD 模块 mime 数据库)。

如果您只依赖$_FILES['uploaded_file']['type'],那么它将包含客户端计算机(即浏览器)上定义的 mime-type,或者浏览器甚至可能不发送 mime-type。

一个非常愚蠢的例子是检查if($_FILES['uploaded_file']['type'] == 'image/jpeg'),当使用将发送'image/pjpeg'mime-type 的IE6/7 时可能会失败

这两种方法的替代方法是使用mime_content_type(),但它已被弃用为 PECL 模块,因此从 PHP 5.3.0 开始,有一些FileInfo函数应该与任何文件类型更加一致——尽管我还没有测试过。

有关 mime 类型的更多概述,请查看这篇 SO 文章:How do I find the mime-type of a file with php?

于 2012-09-04T11:20:17.400 回答
0

永远不要相信$_FILES["image"]["type"]。它接受从浏览器发送的任何内容,因此对于图像类型不要相信它。所以使用getimagesize(),或者如果你想更安全地使用finfo_open

来源: http: //php.net/manual/en/reserved.variables.files.php

于 2012-09-04T11:05:25.057 回答