PHP流/文件上传和max_input_vars

Dav*_*idS 5 php upload stream

当我执行从Java到PHP的流上传时,有时会出现PHP错误,提示输入vars超过了限制max_input_vars

起初,我不知道为什么。首先让我解释一下:

正在使用类似于以下方法的方式上传文件:

// get file data from input stream
$putdata = fopen("php://input", "r");
$tmp = tmpfile();
filesize = stream_copy_to_stream ($putdata, $tmp);
fclose ($putdata);

// copy temp stream into destination stream
$target = fopen('myfile.dwg', "w");        
fseek($tmp, 0, SEEK_SET);
stream_copy_to_stream($tmp, $target);
fclose($target);
fclose ($tmp);
Run Code Online (Sandbox Code Playgroud)

为了了解为什么PHP会给我这样的警告,我对正在发送的数据进行了转储:

file_put_contents ('input_vars.log', print_r ($_REQUEST, true));
file_put_contents ('php_input.log', file_get_contents ('php://input'));
Run Code Online (Sandbox Code Playgroud)

这是有趣的部分:正在上传的文件为1,8 MB。结果日志为:

  • input_vars.log => 5兆字节,90,000行
  • php_input.log => 20兆字节,283,000行

现在错误消息突然看起来合法。该php_input.log只包含字节码,但input_vars.log被格式化为这样的:

Array
(
    [filename] => 0018-101-001_67.dwg
    [versionId] => 11253
    [filetype] => dwg
    [‘á‹Úê-8øFj–sÙ/ghÔ÷JJÐWhvPV] => ...
    ....
)
Run Code Online (Sandbox Code Playgroud)

前三个键是通过GET发送的,其余所有键都是文件数据。如果我搜索并计算的匹配项=>,则会得到25,954个匹配项。然后,我假设REQUEST拥有26,000个密钥。

现在,我的问题是:我已经多次删除了该max_input_vars值,现在它拥有的值30000。我是否应该忽略此安全设置,并将其设置为尽可能高?我担心的是,如果PHP大于30000,则会从REQUEST数组中删除部分,从而使文件损坏。

将此值设置得太高是否存在任何安全问题?是否有更好的方法将文件上传到PHP?

Sni*_*fff 2

也许尝试将enable_post_data_reading指令设置为“false”(或“Off”)以阻止PHP解析文件正文?

顺便说一句,如果您使用 PHP 5.3.9,您应该修补 max_input_vars漏洞