parse_str随机添加分号到键
我将查询字符串作为查询字符串的一部分传递给PHP脚本。
有点像:
$.post('/url', { id: postID filters: $('#form').serialize() });
然后在我的PHP中,我使用parse_str
来读取filters
:
input->post('id'); parse_str($this->input->post('filters'), $filters);
问题是parse_str
正在添加;
随机到钥匙。 我得到这样的结果:
array(4) { ["users"]=> string(0) "" ["companies;"]=> string(0) "" ["pref;_123"]=> string(0) "" ["products;"]=> array(2) { [0]=> string(4) "1234" [1]=> string(4) "5678" } }
为什么服务器添加;
? 我在另一台服务器上试过它,但这不会发生。 通过CLI进行测试时也不会发生这种情况。
编辑 :似乎这不是parse_str
的错,而是某种XSSfilter。 $this->input->post('filters')
(甚至$_POST['filters']
!)包含;
字符。 我查了一下,jQuery没有添加它们。
编辑 :我设法通过这样做“修复”这个:
$filters = array_combine(array_map(function($x){ return str_replace(';', '', $x); }, array_keys($filters)), array_values($filters));
这是由global_xss_filtering
中的配置变量global_xss_filtering
引起的。 将其设置为false以禁用此行为。
也可以看看:
xss_clean在带有&的任何内容中添加分号
CodeIgniter添加分号
我会首先对$ filters做一个var_dump来看看会发生什么。
parse_str将解析你发送它的字符串,如下所示:
$string = "user=&companies=StackOverflow"; parse_str($string, $filters); echo $filters['user']; // empty string echo $filters['companies']; // StackOverflow
我最好的猜测是,从iQuery的序列化 (包括数据)发送的内容未正确序列化/转义,因此parse_str可以轻松地将字符串拆分为&作为每个参数的键/值的分隔符。
阅读手册你肯定在那里正确地做了一些事情,但是你的数据中可能会有一些东西会抛出parse_str。 我也会在jQuery发布的sting中寻找非法字符。