你能相信 PHP 中 $_FILES 数组给出的文件大小吗?

Posted

技术标签:

【中文标题】你能相信 PHP 中 $_FILES 数组给出的文件大小吗?【英文标题】:Can you trust file size given by $_FILES array in PHP? 【发布时间】:2015-05-03 13:23:23 【问题描述】:

对不起,如果它是微不足道的或显而易见的,但我无法通过谷歌搜索找到答案。

$_FILES['name'] 数组中的size 值从何而来?你能相信它的价值 ($_FILES['name']['size']) 还是应该使用filesize() 函数来检查它?

也就是说,是否需要通过filesize函数检查文件的实际大小,以判断是否正确上传?

【问题讨论】:

Can $_FILES[...]['size'] be forged?的可能重复 【参考方案1】:

如果文件上传正确且一切正常,您可以使用 php superglobal $_FILES 提供的信息。使用filesize() 会增加少量开销,因为操作系统需要检查文件的大小。这取决于您,但检查 PHP 源代码以了解它是如何完成这一切的,这清楚地表明它正确计算了 HTTP 多部分请求中的文件大小。基本上,如果你要filesize() 文件,你会再次做同样的工作。

您可以直接从超全局变量中信任它的原因是多部分请求提供了数据所在的边界。根据定义,如果不遵循提取数据的协议,就不可能获得损坏的数据。换句话说,这意味着浏览器发送一个“分隔符”,PHP 简单地找到它并开始检查文本中的分隔符之间的数据。为此,它准确地分配了所需的内存,并且可以立即缓存分配的数字——这个数字就是文件大小。如果在此过程中出现任何问题,您将得到错误。因此,如果文件上传正确,则有关大小的信息是可信的。

【讨论】:

【参考方案2】:

PHP 似乎会在文件上传后重新计算文件的大小。尽管客户端确实发送了一个指定文件的 content-length 的标头,但根据测试(使用 PHP 5.5),此标头被简单地忽略,而是测量长度。就个人而言,我总是使用filesize() 来获取文件大小,因为您可以对使用哪种测量方式更有信心,但这最终取决于您。无论哪种方式,$_FILES['file_name']['size'] 似乎都是一个可以安全使用的值。

【讨论】:

你确定吗?根据我阅读source code responsible for parsing multipart HTTP requests 的理解,生成的 size 反映了从多部分正文中读取的字节数。 @Gumbo 有趣的是,根据我的阅读,它是由客户端指定的,而 upload_max_filesize 在上传时使用测量的计数。我会尝试做一些测试并回复你。 @Gumbo 是的,你完全正确。上传后PHP似乎会重新计算。【参考方案3】:

您应该检查客户端报告的$_FILES['file_name']['size'] 是否等于filesize() 给出的值。差异可能表示上传文件的传输过程中出现错误。

【讨论】:

以上是关于你能相信 PHP 中 $_FILES 数组给出的文件大小吗?的主要内容,如果未能解决你的问题,请参考以下文章

php文件上传之$_FILES全局变量用法介绍

PHP - $_FILES 数组为空 [重复]

$_FILES PHP

PHP 超全局变量之$_FILES

用PHP重命名$ _FILES(文件)

php如何将图片转成字节流