PHP流/文件上载和最大输入变量
当我执行从Java到PHP的流上传时,我有时会收到一个PHP错误,说输入变量超过了PHP流/文件上载和最大输入变量,php,upload,stream,Php,Upload,Stream,当我执行从Java到PHP的流上传时,我有时会收到一个PHP错误,说输入变量超过了max\u input\u vars的限制 起初,我不知道为什么。首先让我解释一下: 上传文件的方法与此类似: //从输入流获取文件数据 $putdata=fopen(“php://input“,“r”); $tmp=tmpfile(); filesize=stream\u copy\u to\u stream($putdata,$tmp); fclose($putdata); //将临时流复制到目标流 $tar
max\u input\u vars
的限制
起初,我不知道为什么。首先让我解释一下:
上传文件的方法与此类似:
//从输入流获取文件数据
$putdata=fopen(“php://input“,“r”);
$tmp=tmpfile();
filesize=stream\u copy\u to\u stream($putdata,$tmp);
fclose($putdata);
//将临时流复制到目标流
$target=fopen('myfile.dwg',“w”);
fseek($tmp,0,SEEK_SET);
流复制到流($tmp,$target);
fclose(目标美元);
fclose($tmp);
为了了解PHP为什么会给我这样的警告,我对发送的数据进行了转储:
file\u put\u contents('input\u vars.log',print\r($\u REQUEST,true));
file\u put\u contents('php\u input.log',file\u get\u contents('php://input'));
有趣的是:
正在上载的文件为1,8 MB。生成的日志包括:
=>5兆字节,90000行input_vars.log
=>20兆字节,283000行php_input.log
php\u input.log
只包含字节码,但是input\u vars.log
的格式如下:
数组
(
[文件名]=>0018-101-001_67.dwg
[versionId]=>11253
[文件类型]=>dwg
[èÚè-8øFj–sÙ/ghÔ÷JJÐWhvPV]=>。。。
....
)
前三个键通过GET发送,其余的都是文件数据。如果我搜索并计算=>
的匹配项,我会得到25954个匹配项。然后我假设REQUEST
包含26000个键
现在,请回答我的问题:
我已经多次刷新了max\u input\u vars
值,现在它的值为30000
。我是否应该忽略此安全设置,并将其设置为尽可能高?
我担心的是,如果请求数组大于30000
,PHP会从中删除部分,从而导致文件损坏
将此值设置得太高是否存在安全问题?是否有更好的方法将文件上传到PHP?您没有展示如何用Java上传文件。PHP将普通POST请求视为来自表单,并尝试解析来自它们的字段——如果数据是二进制的,这是个坏主意。您最好模仿HTML文件上传表单的功能,并发送“多部分post”(an)。然后像从表单接收一样使用。在其本身“php.net”()中,他们报告增加此设置的值没有问题,但是,这是一种“使用此指令缓解使用哈希冲突的拒绝服务攻击的可能性”的形式 要解决此僵局,您可以尝试在运行时使用以下函数设置变量值:
ini_set("max_input_vars", 30000);
我最近讨论了这个问题,以及调用是如何远程的,而不是如何配置运行时的,所以不幸的是,我们不得不增加值
到目前为止,我们还没有问题,但我们的想法是未来,修改代码以按部分发送数据,从而使代码保持在语言的标准当前配置内。也许可以尝试将enable\u post\u data\u reading指令设置为“false”(或“Off”)以防止PHP解析文件体
顺便说一句,如果你使用的是PHP5.3.9,你应该修补max_input_vars。你想做的是,你不应该把它当作帖子来处理;或者-至少-将
内容类型
HTTP头设置为应用程序/octet流
尝试在php.ini中增加大小post\u max\u size、upload\u max\u filesize和max\u file\u uploads。接受的答案是有效的,但是您必须知道,关闭启用发布数据读取
也意味着关闭自动填充$发布
,$获取
和$请求
数组。由于我正在广泛使用这些阵列,我决定将启用\u post\u data\u reading
限制为专用于文件上载的特定文件:
<Files "UploadFile.php">
php_value enable_post_data_reading Off
</Files>
这样做,您就不需要使用$\u REQUEST
或$\u POST
,因为您可以通过以下方式在php中获得信息:
$fileName=$\u服务器['HTTP\u X\u文件名']代码>我无法从手册中读取是否可以通过ini_set()或htaccess设置此值。你知道答案吗?顺便说一下,据我记忆所及,我们使用的是PHP5.4.4.Via.htaccess。在它上面写着“variable-PHP_INI_PERDIR”(条目可以在PHP.INI、.htaccess、httpd.conf或.user.INI中设置(从PHP5.3开始)。应设置为“Off”以防止解析。无论如何,在设置phpinfo()后检查它是否有效。这实际上似乎解决了问题!非常感谢!:)很高兴我能帮忙,大卫!我们现在已经通过htaccess增加了设置(根据文档,在这种情况下,ini_set()是非法的)。但是,我们不能说我们设置的限制是否足够。这很复杂,您必须根据文件生成的索引数量在php.ini中从JAVA配置这个运行时变量。但是,因为您无法移动文件或路径并在PHP中执行处理,所以通过将内容缓冲到HttpUrlConnection
的输出流中来上载文件,并在调用getInputStream()方法后有效地上载文件。
oXhr.setRequestHeader("X-File-Name", I_sFileName);
oXhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");