Php parse_str向键随机添加分号

Php parse_str向键随机添加分号,php,jquery,codeigniter,query-string,Php,Jquery,Codeigniter,Query String,我将查询字符串作为查询字符串的一部分传递给PHP脚本 有点像这样: $.post('/url', { id: postID filters: $('#form').serialize() }); array(4) { ["users"]=> string(0) "" ["companies;"]=> string(0) "" ["pref;_123"]=> string(0) "" ["products;"]=> arra

我将查询字符串作为查询字符串的一部分传递给PHP脚本

有点像这样:

$.post('/url', {
    id: postID
    filters: $('#form').serialize()
});
array(4) {
  ["users"]=>
  string(0) ""
  ["companies;"]=>
  string(0) ""
  ["pref;_123"]=>
  string(0) ""
  ["products;"]=>
  array(2) {
    [0]=>
    string(4) "1234"
    [1]=>
    string(4) "5678"
  }
}
然后在我的PHP中,我使用parse_str读取过滤器:

服务器为什么要添加;?我在另一台服务器上试过了,但没有成功。通过CLI进行测试时也不会发生这种情况

编辑:这似乎不是parse_str的错,而是某种XSS过滤器$这->输入->发布“过滤器”甚至$\u发布[“过滤器”]!包含;人物。我检查了,jQuery没有添加它们

编辑:我通过以下操作解决了此问题:

$filters = array_combine(array_map(function($x){
    return str_replace(';', '', $x);
}, array_keys($filters)), array_values($filters));

这是由Codeigniter中的配置变量global_xss_过滤引起的。将其设置为false可禁用此行为

另见:

我会首先对$filters进行var_转储,看看会出现什么

将解析您发送的字符串,如下所示:

$string = "user=&companies=StackOverflow";
parse_str($string, $filters);
echo $filters['user']; // empty string
echo $filters['companies']; // StackOverflow
我的最佳猜测是,从包含数据的数据发送的内容没有正确序列化/转义,因此parse_str可能很容易用&作为每个参数的键/值的分隔符来拆分字符串


在阅读手册时,您肯定是在正确地执行操作,但您的数据中可能隐藏着某些东西,从而导致语法错误。我还将在jQuery发布的sting中查找非法字符。

我将首先对$filters进行var_转储,看看会出现什么。您在Ajax请求中看到什么奇怪的东西吗?还是问题只在于PHP?你能用一个静态字符串重现这个问题吗,比如parse_strusers=&companys=…?嗯:$this->input->post'filters'似乎包含;是的。似乎这不是parse_str的错。你运行的是什么版本的CodeIgniter?见@JordanArseno:CodeIgniter 2。问题是$\u POST['filters']还添加了;。即使$\u POST['filters']也包含;角色!似乎不能在运行时设置$此->配置->设置_项“全局_xss_筛选”,错误;没有帮助。parse_str可以很好地处理手动输入的字符串。隐马尔可夫模型。。。。似乎$\u POST['filters']包含;人物。我检查了,jQuery没有添加它们。
$string = "user=&companies=StackOverflow";
parse_str($string, $filters);
echo $filters['user']; // empty string
echo $filters['companies']; // StackOverflow