2012-09-06 65 views
4

我将查询字符串作为查询字符串的一部分传递给PHP脚本。parse_str随机向密钥添加分号

有点像这样:

$.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)); 
+3

我会首先做一个$ filters的var_dump来看看会发生什么。 –

+0

您是否在Ajax请求中看到奇怪的东西?或者只有PHP的问题?你可以使用静态字符串来重现问题,比如'parse_str(“users =&companies = ...”)'? – Tchoupi

+0

嗯:'$ this-> input-> post('filters')'似乎包含';'字符。看起来不是'parse_str'的​​错。 –

回答

2

我首先做$过滤器的的var_dump看到什么是未来

parse_str将解析字符串你把它像这样:

$string = "user=&companies=StackOverflow"; 
parse_str($string, $filters); 
echo $filters['user']; // empty string 
echo $filters['companies']; // StackOverflow 

我最好的猜测是,iQuery's serialize(包含数据)发送的内容是否定的t可能正确地序列化/转义,因此parse_str可以很容易地将&分割为每个参数的键/值的分隔符。

阅读手册,您肯定会在那里做正确的事情,但可能会有一些潜在的数据抛出parse_str。我还会在jQuery发布的sting中查找非法字符。

+0

'parse_str'可以正常使用手动输入的字符串。嗯....似乎'$ _POST ['filters']'包含';'字符。我检查了,jQuery没有添加它们。 –