当我执行从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?
| 归档时间: |
|
| 查看次数: |
2195 次 |
| 最近记录: |