Php $文件[';上载的&#img';][';类型';]与getimagesize()

Php $文件[';上载的&#img';][';类型';]与getimagesize(),php,Php,我想检查上传的文件类型,请告诉我在哪里的方式是可靠的,在这种情况下,我获得更准确的信息文件类型?在这方面: $_files['uploaded_file']['type'] 或在这方面: $imgType = getimagesize($_files['uploaded_file']['tmp_name']); $imgType['mime']; ?$\u文件[…]['type']永远不可靠,它是用户提供的任意值getimagesize,或者是检查您拥有的内容的首选方法。另请参见。在实践中,

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

$_files['uploaded_file']['type']
或在这方面:

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

$\u文件[…]['type']
永远不可靠,它是用户提供的任意值
getimagesize
,或者是检查您拥有的内容的首选方法。另请参见。

在实践中,您可能应该使用图像附带的元数据(
$\u files['uploaded\u file']['type']
),但这可能会在上载之前被篡改


如果您刚刚测量了图像大小,请使用此选项,因为它比使用
getimagesize
实际测量图像要快。但是,如果您要查看文件类型信息,最好检查文件“显示”以外的内容,因为通过简单的检查很容易隐藏可执行文件。

I Trustgetimagesize


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

$\u文件['upload\u file']['type']
是用户输入-它是客户端定义的任意字符串。因此,它是不安全的使用任何东西,永远

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

您还需要:

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

永远不要信任
$\u文件[“图像”][“类型”]
。它接受从浏览器发送的任何内容,因此对于图像类型,不要信任此选项。因此,请使用
getimagesize()
或者如果您想更安全,请使用
finfo\u open

来源:

使用
getimagesize()
将为您提供更一致的mime信息,因为它使用了文件(GD模块mime数据库)的环境
mime类型定义

如果您仅依赖
$\u文件['uploaded\u file']['type']
,则它将包含客户端计算机(即浏览器)上定义的mime类型,或者浏览器甚至可能不发送mime类型

一个相当愚蠢的例子是检查
如果($\u FILES['uploaded\u file']['type']=='image/jpeg')
,当使用IE6/7发送
'image/pjpeg'
mime类型时可能会失败

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

有关mime类型的更多概述,请参阅本文: