$ _files ['uploaded_img'] ['type'] vs getimagesize()

时间:2012-09-04 10:53:25

标签: php

我想检查上传文件类型,请告诉我哪里可靠的方式,在哪种情况下获取更多关于文件类型的信息?在这:

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

或在此:

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

6 个答案:

答案 0 :(得分:7)

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

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

您还需要:

  • 将文件存储在本地服务器上,其名称完全由您自己设计。依赖任何用户输入来生成本地文件系统文件名是不安全的。
  • 使用GD将像素数据从源文件复制到目标文件。 getimagesize()仅查看与文件关联的元数据,而不查看文件数据。可以将恶意代码隐藏在看起来像图像的内容中。重新采样图像后,请确保已从服务器中删除上载的文件。
  • 确保文件存储在具有最低必需权限和限制所有者/组的本地文件系统中。

答案 1 :(得分:3)

$_FILES[...]['type'] 从不可靠,它是用户提供的任意值。 getimagesizeexif_imagetypefinfo是检查您所拥有内容的首选方式。另请参阅Security threats with uploads

答案 2 :(得分:2)

我相信 getimagesize

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

答案 3 :(得分:1)

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

如果您只是在尺寸之后,请使用它,因为它比使用getimagesize实际测量图像更快。但是,如果您在文件类型信息之后,最好检查文件“说”的内容,因为通过天真的检查可以轻松隐藏可执行文件。

答案 4 :(得分:1)

使用getimagesize()将为您提供更一致的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-types的更多概述,请查看此SO文章:How do I find the mime-type of a file with php?

答案 5 :(得分:0)

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

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