php中post键值过多引起的一个bug
2013-05-08 00:40
393 查看
今天在前任开发员遗留的项目中遇到这么一个奇怪的问题。纠结了很长时间,突然间恍然大悟,想起自己以前看过的一篇文章,瞬间所有的怪异现象全有了解释。
这个怪异问题是这样的。
我有一个很长很长的表单。如下:
<form actionmethod=”post”>
<inputtype=”checkbox” name=”user_id[]” value=”001”/>
<inputtype=”text” name=”001_name”/>
<inputtype=”text” name=”001_address”/>
<inputtype=”text” name=”001_email”/>
<inputtype=”checkbox” name=”user_id[]” value=”002”/>
<inputtype=”text” name=”002_name”/>
<inputtype=”text” name=”002_address”/>
<inputtype=”text” name=”002_email”/>
<inputtype=”checkbox” name=”user_id[]” value=”003”/>
<inputtype=”text” name=”003_name”/>
<inputtype=”text” name=”003_address”/>
<inputtype=”text” name=”003_email”/>
.
.
.
<inputtype=”checkbox” name=”user_id[]” value=”500”/>
<inputtype=”text” name=”500_name”/>
<inputtype=”text” name=”500_address”/>
<inputtype=”text” name=”500_email”/>
<inputtype=”submit”/>
</form>
当我提交表单,发现这么个奇怪的问题。我选择前面的用户传过来的$_POST['user_id']是正常的,但是到我选择后面的几个用户(例如第500个用户)时,发现$_POST['user_id']是不存在的。百思不得其解,前面的checkbox和后面的checkbox没有什么区别啊,但是为什么就是传不过去呢?
然后我在php中用file_get_content('php://input')打印出原始的post字符串发现是……user_id%5B%5D=480&……。所名原始post是的的确确把user_id[]原本传输过来的。那么问题肯定是发生在php把post流转化成$_POST数组中出现了问题的。然后发现当我选择前面的用户时…user_id%5B%5D=020&……的post字符流位置很靠前,而当…user_id%5B%5D=500在流中的位置很靠后。然后突然想到看过风雪之隅的一片关于通过构造Hash冲突实现各种语言的拒绝服务攻击文章,发现php5.3.8之后的版本在配置文件里增加了max_input_vars选项,默认是1000.而我的表单提交的post已经达到2000个,超过1000的限制。所以php就把超过的键值给截掉了。所以导致我选前面的用户$_POST['user_id']有值,选择后面的有没有了的怪异现象。
其次,由于我的键值都很短,所以整个post流并不大,所以不会产生php内存报警。
再次意识到这样大面积构造荣冗余的表达是一个非常糟糕的编码习惯。
这个怪异问题是这样的。
我有一个很长很长的表单。如下:
<form actionmethod=”post”>
<inputtype=”checkbox” name=”user_id[]” value=”001”/>
<inputtype=”text” name=”001_name”/>
<inputtype=”text” name=”001_address”/>
<inputtype=”text” name=”001_email”/>
<inputtype=”checkbox” name=”user_id[]” value=”002”/>
<inputtype=”text” name=”002_name”/>
<inputtype=”text” name=”002_address”/>
<inputtype=”text” name=”002_email”/>
<inputtype=”checkbox” name=”user_id[]” value=”003”/>
<inputtype=”text” name=”003_name”/>
<inputtype=”text” name=”003_address”/>
<inputtype=”text” name=”003_email”/>
.
.
.
<inputtype=”checkbox” name=”user_id[]” value=”500”/>
<inputtype=”text” name=”500_name”/>
<inputtype=”text” name=”500_address”/>
<inputtype=”text” name=”500_email”/>
<inputtype=”submit”/>
</form>
当我提交表单,发现这么个奇怪的问题。我选择前面的用户传过来的$_POST['user_id']是正常的,但是到我选择后面的几个用户(例如第500个用户)时,发现$_POST['user_id']是不存在的。百思不得其解,前面的checkbox和后面的checkbox没有什么区别啊,但是为什么就是传不过去呢?
然后我在php中用file_get_content('php://input')打印出原始的post字符串发现是……user_id%5B%5D=480&……。所名原始post是的的确确把user_id[]原本传输过来的。那么问题肯定是发生在php把post流转化成$_POST数组中出现了问题的。然后发现当我选择前面的用户时…user_id%5B%5D=020&……的post字符流位置很靠前,而当…user_id%5B%5D=500在流中的位置很靠后。然后突然想到看过风雪之隅的一片关于通过构造Hash冲突实现各种语言的拒绝服务攻击文章,发现php5.3.8之后的版本在配置文件里增加了max_input_vars选项,默认是1000.而我的表单提交的post已经达到2000个,超过1000的限制。所以php就把超过的键值给截掉了。所以导致我选前面的用户$_POST['user_id']有值,选择后面的有没有了的怪异现象。
其次,由于我的键值都很短,所以整个post流并不大,所以不会产生php内存报警。
再次意识到这样大面积构造荣冗余的表达是一个非常糟糕的编码习惯。
相关文章推荐
- 一个由于php代码结束符引起的技术bug
- 一个由于spring事务引起的bug
- php数组根据某一个键值,把相同键值的合并生成一个新的二维数组
- windows 下 nginx + php 的一个Bug
- 【转】php中iconv函数的一个小bug
- 一个lua代码中的bug引起的思考:不要被c++ crash堆栈误导
- 用PHP通过HTTP POST到一个远程WEB SITE上
- php 数组分组 二维数组中,将某个键值相同的合并到一个数组中
- 一个分号引起的bug
- PHPCMS V9.3.2用户注册模板中的一个低级Bug
- 一个由自增运算符以及C语法顺序细节引起的bug
- 关于ligerUI中ligerTree代码中的一个bug,造成该控件无法通过url的POST方式加载数据
- 通过View.post()获取View的宽高引发的两个问题:1post的Runnable何时被执行,2为何View需要layout两次;以及发现Android的一个小bug
- php将一个字符串转变成键值对数组的效率问题
- 一个由于全局变量引起的BUG
- php 数组根据某一个键值,键值相同,则合并数组
- 处理系统中一个并发引起的bug
- 一个BUG引起的思考
- PHP 对一个给定的二维数组按照指定的键值进行排序
- 一个页面使用两次timepicker.js引起的Maximum call stack size exceeded问题解决办法及bug修复