【问题标题】:parse_str randomly adding semicolons to keysparse_str 随机向键添加分号
【发布时间】:2012-09-06 17:59:44
【问题描述】:

我将查询字符串作为查询字符串的一部分传递给 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-&gt;input-&gt;post('filters')(甚至$_POST['filters']!)包含; 字符。我检查了,jQuery 没有添加它们。

编辑:我设法“解决”了这个问题:

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

【问题讨论】:

  • 我会先做一个 $filters 的 var_dump 看看有什么进来。
  • 您在 Ajax 请求中看到什么奇怪的东西了吗?或者问题只出在 PHP 上?你能用parse_str("users=&amp;companies=...")之类的静态字符串重现问题吗?
  • 嗯:$this-&gt;input-&gt;post('filters') 似乎包含了; 字符呢。看来这不是parse_str 的错。
  • 你运行的是什么版本的 CodeIgniter?见this thread
  • @JordanArseno: CodeIgniter 2. 东西是$_POST['filters'] 还添加了;

标签: php jquery codeigniter query-string


【解决方案1】:

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

另请参阅:
xss_clean adds semicolon to anything with an &
CodeIgniter adding semicolons

【讨论】:

  • 即使$_POST['filters'] 也包含; 字符!
  • 似乎不能在运行时设置。 $this-&gt;config-&gt;set_item('global_xss_filtering', FALSE); 没有帮助。
【解决方案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 可以轻松地将字符串拆分为 & 作为每个参数的键/值的分隔符。

阅读手册你肯定在那里做正确的事情,但可能有一些东西潜伏在你的数据中,导致 parse_str 关闭。我还会在 jQuery 发布的字符串中查找非法字符。

【讨论】:

  • parse_str 可以很好地与手动输入的字符串配合使用。嗯....似乎$_POST['filters'] 包含; 字符。我检查了,jQuery 没有添加它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2019-05-25
  • 2021-06-22
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多