parse_str随机添加分号键(parse_str randomly adding semicol

2019-09-22 05:13发布

我传递一个查询字符串作为我的查询字符串到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));

Answer 1:

这是由配置变量引起global_xss_filtering在笨。 它设置为false可禁用此行为。

也可以看看:
xss_clean加分号以&什么
笨加分号



Answer 2:

我首先做$过滤器的的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刺痛非法字符。



文章来源: parse_str randomly adding semicolons to keys