在PHP中,您可以信任$_FILES数组给出的文件大小吗?

17

抱歉,如果这个问题很琐碎或者很明显,我通过谷歌搜索无法找到答案。

$_FILES ['name']数组中的size值从哪里来?你能相信它($_FILES['name']['size'])的值吗?还是说你仍然需要使用filesize()函数来检查它?

换句话说,在上传文件时是否有必要通过filesize函数检查实际文件大小以观察它是否被正确上传?


1
可能是Can $_FILES[...]['size'] be forged?的重复问题。 - Magnar Myrtveit
3个回答

14
如果文件上传正确,一切正常,您可以使用PHP超全局变量$_FILES提供的信息。使用filesize()会增加一些开销,因为操作系统需要检查文件大小。这取决于您,但是检查PHP源代码如何完成所有这些工作清楚地表明它正确地计算了HTTP多部分请求中的文件大小。如果您要对文件进行filesize(),那么您将再次执行相同的任务。
您可以直接从超全局变量信任此信息的原因是多部分请求在数据之间提供边界。根据定义,如果未遵循提取数据的协议,则不可能获取损坏的数据。换句话说,浏览器发送一个“定界符”,PHP只需找到它并开始检查该定界符之间的文本以获取数据。为此,它准确地分配所需的内存,并且可以立即缓存分配的数字 - 该数字就是文件大小。如果沿途有任何错误,您将获得错误。因此,如果文件上传正确,则可以信任有关大小的信息。

9

上传后PHP似乎会重新计算文件的大小。虽然客户端会发送一个指定文件content-length的头部,但根据测试(使用PHP 5.5),该头部被忽略了,实际上是通过测量来确定文件大小。个人建议始终使用filesize()来获取文件大小,因为可以更加确信所使用的测量方式,但最终决定权在您手中。无论如何,$_FILES['file_name']['size']似乎是一个安全的值。


2
你确定吗?根据我阅读负责解析多部分HTTP请求的源代码(https://github.com/php/php-src/blob/master/main/rfc1867.c)的理解,结果的“大小”反映了从多部分部分体中读取的字节数。 - Gumbo
@Gumbo 很有趣,根据我所读的,它是由客户端指定的,而upload_max_filesize则使用上传时的计数。我会尝试进行一些测试并回复您。 - Anonymous
1
@Gumbo 是的,你说得对。PHP似乎在上传后重新计算它。 - Anonymous

4

您应该检查客户端报告的$_FILES ['file_name'] ['size']是否等于filesize()给出的值。 差异可能表明在上传文件时发生错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接