parse_str随机添加分号到键

时间:2012-09-06 17:59:44

标签: php jquery codeigniter query-string

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

有点像这样:

$.post('/url', {
    id: postID
    filters: $('#form').serialize()
});

然后在我的PHP中,我使用parse_str来阅读filters

<?php
$postID = $this->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的错,而是某种XSS过滤器。 $this->input->post('filters')(甚至$_POST['filters']!)包含;个字符。我查了一下,jQuery没有添加它们。

编辑:我通过以下方式设法“修复”:

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

2 个答案:

答案 0 :(得分:4)

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

另见:
xss_clean adds semicolon to anything with an &
CodeIgniter adding semicolons

答案 1 :(得分:2)

我首先会对$ filters做一个var_dump,看看会发生什么。

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

$string = "user=&companies=StackOverflow";
parse_str($string, $filters);
echo $filters['user']; // empty string
echo $filters['companies']; // StackOverflow

我最好的猜测是,从iQuery's serialize发送的内容(包括数据)未正确序列化/转义,因此parse_str可以轻松地将字符串与&amp;作为每个参数的键/值的分隔符。

阅读手册你肯定在那里正确地做了一些事情,但是你的数据中可能会有一些东西会抛出parse_str。我也会在jQuery发布的sting中寻找非法字符。