【发布时间】:2012-10-14 13:24:56
【问题描述】:
当我执行从 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?
【问题讨论】: