php中的新限制:每个POST有1000个字段.有人知道这个数字是否会受到影响吗


new limit within php: 1000 fields per POST. Does someone know, if the number can be influenced?

在较新的PHP版本中,每个公式的输入文件数(POST)将限制为1000(未经验证的信息)。这一限制已经安装在5.2的某些版本中。这给我们的网店带来了很多问题。

有人对此了解更多吗?这个限制是否会受到参数或变量的影响。我刚刚找到了max_input_vars,但它似乎是5.4.RC4的一个全新的var。我不确定这个var是否会是POST方法的var。

max_input_vars

是PHP解决一些安全问题的一种尝试,当设置时,它会限制输入的数量(从而限制表单中的字段)。还要注意

最大输入目标电平

是的,它们是可配置的。只需编辑php.ini或htaccess值。

我也遇到了这个问题,我正在进行代码的本地化安装,Debian Sid已经升级到5.4 RC4 PHP。一个包含7000多行复选框(!)的表单突然只处理了$_POST数据中的1001行。。。挠头几个小时。

在/etc/php5/apache2/php.ini中进行了更改:

max_input_vars = 5000

保存并重新启动apache,现在一切都很好。

如果您不能/不想增加服务器限制,这里有另一个解决方案

<!-- 10000 checkboxes outside the FORM. You do not want to post this -->
<input class="cbox" type="checkbox" value="1"  id="id-1" checked name="id[]">
....
<input class="cbox" type="checkbox" value="10000"  id="id-10000" checked name="id[]">
<form method="POST" action="postpage.php">
    <input type="hidden" id="cboxes" name="cboxes" class="cboxes" value="" />
    <input type="submit" onclick="return clicked();">
</form>

然后使用jquery

<script>
function clicked() {
    var cb = $('.cbox:checked').map(function() {return this.value;}).get().join(',');
    $('#cboxes').val(cb);
    return true;
}
</script>

使用POST,我测试了发布10000条记录。

在服务器中

$cboxes = $_POST['cboxes'];
$cbox_exp =(explode(',', $cboxes));
print_r(count($cbox_exp)); //gives me 10000

只是想总结并指出一些事情:

1) 限制可以是上面提到的PHP。

2) 上面也提到了网络服务器的限制。

3) Suhosin限制仅适用于已安装的情况。php.ini 中的设置已更改

4) 如果你试图在URL 中提交那么多数据,请注意浏览器URL长度限制

更改任何服务器设置后重新启动web服务器。

显然,它看起来像是linux环境上的一个补丁,导致了这个问题。如果你的服务器有这个补丁"suhosin",很可能是问题所在。此外,也不可能在运行时覆盖它,而是将其包含在php.ini

suhosin.post.max_array_depth 
suhosin.post.max_array_index_length 
suhosin.post.max_name_length 
suhosin.post.max_totalname_length 
suhosin.post.max_vars 
suhosin.post.max_value_length 

只字符串化您提交的一些数据总是很好的,而不是在PHP中更改这个限制。例如,如果您通过Ajax或表单字段发送内容,只需字符串化导致问题的字段即可。

如果有意义的话,限制是字段的"数量",而不是"长度"。

这些更改往往有很好的文档记录。你确定它已经被移植到5.2了吗?你在哪里读到的?您似乎更可能达到了其他限制,如post_max_size或Apache的LimitRequestFields,甚至是像Suhosin这样的PHP安全模块。

(此外,不再支持PHP 5.2,所以我怀疑它是否会得到这样的升级。)

如果你像我一样使用Dreamhost,你可以在/home/<<siteuser>>/.php/<<X.Y>>中创建一个phprc文件(siteuser=你的网站运行的用户,X.Y=php版本如7.2)

在phprc中,我添加了max_input_vars = 2000

如果使用的是PHP 7.2版,则必须使用killall -9 php72.cgi杀死所有PHP进程才能生效

更多信息请点击此处https://help.dreamhost.com/hc/en-us/articles/214200668-How-do-I-create-a-phprc-file-via-SSH-

如果不使用多个或超过1000个输入字段您可以将多个输入与任何特殊字符连接起来,例如@

<input type='text' name='hs1' id='hs1'>
<input type='text' name='hs2' id='hs2'>
<input type='text' name='hs3' id='hs3'>
<input type='text' name='hs4' id='hs4'>
<input type='text' name='hs5' id='hs5'>
<input type='hidden' name='hd' id='hd'>

使用任何脚本(JavaScript或JScript)

document.getElementById("hd").value =     document.getElementById("hs1").value+"@"+document.getElementById("hs2").value+"@"+document.getElementById("hs3").value+"@"+document.getElementById("hs4").value+"@"+document.getElementById("hs5").value

有了这个概念,您将绕过max_input_vars问题。如果在php.ini文件中增加max_input_vars,则对服务器有害。因为它们使用更多的服务器缓存,有时还会使服务器崩溃。