PHP中的MAX_FILE_SIZE - 有什么意义?

Vil*_*lx- 28 php

我试图创建一个文件上传表单并检查PHP文档以刷新我对这个主题的记忆.以下是相关文章的链接.我突然注意到了这条消息:

MAX_FILE_SIZE隐藏字段(以字节为单位)必须位于文件输入字段之前,其值是PHP接受的最大文件大小.应始终使用此表单元素,因为它可以节省用户等待传输大文件的麻烦,只是发现它太大而传输失败.请记住:在浏览器端愚弄此设置非常简单,因此不要依赖此功能阻止更大尺寸的文件.它仅仅是应用程序客户端用户的便利功能.但是,最大大小的PHP设置(在服务器端)不能被愚弄.

好的......说什么?首先,它告诉它必须在文件上载字段之前.然后它告诉我们这仅仅是为了方便.而且 - 无论如何它都在客户端,所以任何人都可以搞砸它.谷歌搜索后,我也发现没有已知浏览器支持它的信息.

WTF?为什么它说它必须在文件上传字段之前,如果它(似乎所有意图和目的)绝对没有意义?我应该把它放在我的HTML中吗?

Sta*_*ann 34

在尝试找到关于MAX_FILE_INFO的任何权威信息失败之后,我决定采取严厉的措施 - 并且偷看了PHP的神圣来源.

我使用grep以递归方式扫描整个PHP源代码:

grep -ri MAX_FILE_SIZE .
Run Code Online (Sandbox Code Playgroud)

提到这个变量的唯一地方是(不包括测试文件夹) - rfc1867.c文件.完全可以预见,因为rfc1867标准处理文件上传.

相关C代码:

......
if (!strcasecmp(param, "MAX_FILE_SIZE")) {                                                                                                                                                                              
   max_file_size = atol(value);
}
......
......
if (PG(upload_max_filesize) > 0 && (total_bytes+blen) > PG(upload_max_filesize)) {
    cancel_upload = UPLOAD_ERROR_A;
} else if (max_file_size && ((total_bytes+blen) > max_file_size)) {
    cancel_upload = UPLOAD_ERROR_B;
} else if
....
Run Code Online (Sandbox Code Playgroud)

所以 - 这里是上面代码的简短说明:

1)首先我们将MAX_FILE_SIZE的值输入max_file_size变量.

2)然后我们检查max_file_size值是否存在以及已接受的字节总数(total_bytes)+缓冲区(blen)中的字节大小是否超过max_file_size.

3)如果2为真 - 此时我们取消上传,其中包含一些由此常量设置的错误代码:UPLOAD_ERROR_B

但是 - 正如你所看到的 - 在检查max_file_size变量之前 - PHP对upload_max_filesize变量执行完全相同的检查!因此,我们有它.

结论: IMHO - op是对的 - 将MAX_FILE_SIZE包含在表单中有0分!只需在php.ini文件中设置upload_max_filesize,或通过ini_set()动态设置.

  • 我把它读作",这个HTML表单处理的扩展已被添加,以限制上传超大文件的尝试.想法是,如果文件太大,**浏览器**甚至不会_start_上传.不幸的是,很少(如果有的话)浏览器此时遵守此扩展/指令,但将来可能会更多.最后,它很容易欺骗,所以不要指望它(在服务器端检查).准确阅读? (3认同)

Mee*_*p3D 16

目前没有任何浏览器真正关心MAX_FILE_SIZE指令,因此它毫无意义.我想它确实可以让你对上传的最大尺寸进行更精细的控制(如上面所说的海报),而不是使用php.ini,但我个人只是忽略它,你可能也应该这样做.它肯定不会阻止用户上传大于所需文件 - 手册在这方面相当误导.

  • 它不是为了安全 - **它是为了用户体验**."它为用户节省了等待传输大文件的麻烦,只是发现它太大而传输失败了." 它也不适用于浏览器 - 如果[cancel_upload],请参阅PHP源文件[停止从缓冲区读取](https://github.com/php/php-src/blob/1c295d4a9ac78fcc2f77d6695987598bb7abcb83/main/rfc1867.c#L1028)检查max_file_size后设置(https://github.com/php/php-src/blob/1c295d4a9ac78fcc2f77d6695987598bb7abcb83/main/rfc1867.c#L1053). (2认同)

Pac*_*ier 11

在我们找到支持它的浏览器之前,客户端没有意义.

但是,在服务器端,MAX_FILE_SIZE 确实会影响您获得的值$_FILES['your_file'].

假设浏览器的请求实际通过post_max_size,通常这是PHP给出的:

array(5) {
    ["name"]=> string(11) "my_upload.dll"
    ["type"]=> string(24) "application/x-msdownload"
    ["tmp_name"]=> string(26) "C:\WINDOWS\Temp\php86A.tmp"
    ["error"]=> int(0) // UPLOAD_ERR_OK
    ["size"]=> int(238592)
}
Run Code Online (Sandbox Code Playgroud)

但如果上传的文件大小超过MAX_FILE_SIZE,您会看到:

array(5) {
    ["name"]=> string(11) "my_upload.dll"
    ["type"]=> string(0) ""
    ["tmp_name"]=> string(0) ""
    ["error"]=> int(2) // UPLOAD_ERR_FORM_SIZE
    ["size"]=> int(0)
} 
Run Code Online (Sandbox Code Playgroud)

而" MAX_FILE_SIZE必须在文件输入字段之前"的部分不是一个笑话.它实际上是有效的,因为PHP将按POST顺序解释浏览器的请求有效负载:

<input name=F1 type=file> 
<input name=F2 type=file>
F1 and F2 will not be affected by MAX_FILE_SIZE

<input name=MAX_FILE_SIZE value=1024 type=hidden>
<input name=F3 type=file>
<input name=F4 type=file>
F3 and F4 will have MAX_FILE_SIZE = 1024 bytes

<input name=MAX_FILE_SIZE value=0 type=hidden>
<input name=F5 type=file>
<input name=F6 type=file>
F5 and F6 will have MAX_FILE_SIZE = 0 (infinite)

<input name=MAX_FILE_SIZE value=1 type=hidden>
<input name=F7 type=file> 
<input name=F8 type=file>
F7 and F8 will have MAX_FILE_SIZE = 1 byte
Run Code Online (Sandbox Code Playgroud)

还要注意的是PHP解释MAX_FILE_SIZE的情况下不区分大小写,所以maX_fILe_sIZEMax_File_SIZE就工作了.

  • 感谢它,只是偶然发现了这篇文章. (2认同)