我将查询字符串作为查询字符串的一部分传递给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));
答案 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中寻找非法字符。