当我执行从 Java 到 PHP 的流上传时,有时会收到一个 PHP 错误,提示输入变量超出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);
为了了解为什么 PHP 会给我这样的警告,我转储了正在发送的数据:
file_put_contents ('input_vars.log', print_r ($_REQUEST, true));
file_put_contents ('php_input.log', file_get_contents ('php://input'));
这是有趣的部分:正在上传的文件是 1.8 兆字节。生成的日志是:
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] => ...
....
)
前三个密钥是通过 GET 发送的,其余的都是文件数据。如果我搜索并计算 的匹配项=>
,我会得到 25,954 个匹配项。然后我假设它REQUEST
拥有 26,000 个密钥。
现在,回到我的问题:我已经max_input_vars
多次提高了价值,现在它的价值为30000
. 我是否应该忽略此安全设置,并将其设置为尽可能高?我担心的是 PHP 会从 REQUEST 数组中删除大于 的部分30000
,从而导致文件损坏。
将此值设置得太高是否存在任何安全问题?是否有更好的方法将文件上传到 PHP?