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

Orm*_*moz 15 php security post filesize

对不起,如果它是微不足道的或明显的,但我通过谷歌搜索找不到答案.

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

换句话说,是否有必要按filesize功能检查实际文件大小,以确定是否正确上传?

N.B*_*.B. 13

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

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


Ano*_*ous 9

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

  • 你确定吗?根据我的理解阅读[负责解析多部分HTTP请求的源代码](https://github.com/php/php-src/blob/master/main/rfc1867.c),得到的*size*反映了从多部分主体读取的字节数. (2认同)