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中寻找非法字符。