4

我将查询字符串作为查询字符串的一部分传递给 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;s 随机添加到键中。我得到这样的结果:

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));
4

2 回答 2

4

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

另请参阅:
xss_clean 将分号添加到任何带有 &
CodeIgniter 添加分号的内容

于 2012-09-06T18:11:11.270 回答
2

我会先做一个 $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 发布的字符串中查找非法字符。

于 2012-09-06T18:15:13.930 回答