【发布时间】: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->input->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=&companies=...")之类的静态字符串重现问题吗? -
嗯:
$this->input->post('filters')似乎包含了;字符呢。看来这不是parse_str的错。 -
你运行的是什么版本的 CodeIgniter?见this thread
-
@JordanArseno: CodeIgniter 2. 东西是
$_POST['filters']还添加了;。
标签: php jquery codeigniter query-string