我想检查上传文件类型,请告诉我哪里可靠的方式,在哪种情况下获取更多关于文件类型的信息?在这:
$_files['uploaded_file']['type']
或在此:
$imgType = getimagesize($_files['uploaded_file']['tmp_name']);
$imgType['mime'];
答案 0 :(得分:7)
$_FILES['uploaded_file']['type']
是用户输入 - 它是客户端定义的任意字符串。因此,永远不能安全地使用任何东西。
getimagesize()
是一种更安全的方法,但它并不能完全保护你。
您还需要:
getimagesize()
仅查看与文件关联的元数据,而不查看文件数据。可以将恶意代码隐藏在看起来像图像的内容中。重新采样图像后,请确保已从服务器中删除上载的文件。答案 1 :(得分:3)
$_FILES[...]['type']
从不可靠,它是用户提供的任意值。 getimagesize
,exif_imagetype
或finfo是检查您所拥有内容的首选方式。另请参阅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