我想检查上传文件类型,请告诉我在哪里可靠,在这种情况下获得我更准确的文件类型信息?在这:
$_files['uploaded_file']['type']
或者在这个:
$imgType = getimagesize($_files['uploaded_file']['tmp_name']);
$imgType['mime'];
?
我想检查上传文件类型,请告诉我在哪里可靠,在这种情况下获得我更准确的文件类型信息?在这:
$_files['uploaded_file']['type']
或者在这个:
$imgType = getimagesize($_files['uploaded_file']['tmp_name']);
$imgType['mime'];
?
$_FILES['uploaded_file']['type']
是用户输入 - 它是客户端定义的任意字符串。因此,使用任何东西都是不安全的,永远。
getimagesize()
是一种更安全的方法,但它并不能完全保护您。
您还需要:
getimagesize()
只查看与文件关联的元数据,不查看文件数据。可以将恶意代码隐藏在看起来像图像的东西中。重新采样图像后,请确保从服务器中删除上传的文件。$_FILES[...]['type']
永远不可靠,它是用户提供的任意值。getimagesize
,exif_imagetype
或finfo是检查您所拥有内容的首选方法。另请参阅上传的安全威胁。
我相信getimagesize
因为任何人都可以编辑上传的文件类型使用任何 HTTP/HTTPS 标头,例如在 firefox 中篡改数据插件
在实践中,您可能应该使用图像附带的元数据 ( $_files['uploaded_file']['type']
),但是这可能在上传之前被篡改。
如果您只是在尺寸之后,请使用它,因为它比实际测量图像更快getimagesize
。但是,如果您需要文件类型信息,最好检查文件“所说”之外的内容,因为通过幼稚的检查很容易潜入可执行文件。
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?
永远不要相信$_FILES["image"]["type"]
。它接受从浏览器发送的任何内容,因此对于图像类型不要相信它。所以使用getimagesize()
,或者如果你想更安全地使用finfo_open