2012-09-06 76 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沒有添加它們。 –