2012-09-06 4 views
4

쿼리 문자열을 PHP 스크립트에 전달하고 있습니다. 일종의 이런parse_str 키에 세미콜론을 임의로 추가합니다.

는 :

$.post('/url', { 
    id: postID 
    filters: $('#form').serialize() 
}); 

그런 다음 내 PHP에서, 나는 filters을 읽을 수 parse_str를 사용

<?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

나는 무엇이 들어오는 지 알아보기 위해 $ 필터 중 var_dump를 먼저 수행 할 것입니다. –

+0

Ajax 요청에 이상한 점이 있습니까? 또는 문제는 PHP에서만 발생합니까? 'parse_str ("users = & companies = ...")'와 같은 정적 문자열을 사용하여 문제를 재현 할 수 있습니까? – Tchoupi

+0

Hmm :'$ this-> input-> post ('filters')'는';'문자를 포함하고있는 것처럼 보입니다. 'parse_str'의 잘못이 아닌 것 같습니다. –

답변

4

이는 CodeIgniter의에서 설정 변수 global_xss_filtering에 의해 발생합니다. 이 동작을 사용하지 않으려면 false로 설정하십시오.

은 참조 :
xss_clean adds semicolon to anything with an &
CodeIgniter adding semicolons

+0

심지어'$ _POST [ 'filters']'는';'문자를 포함합니다! –

+0

런타임시 설정할 수있는 것 같지 않습니다. '$ this-> config-> set_item ('global_xss_filtering', FALSE);'도움이되지 않았습니다. –

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 (데이터 포함)에서 전송되는 내용이 아니오 parse_str은 & 문자열을 각 매개 변수의 키/값 구분 기호로 쉽게 분리 할 수 ​​있으므로 적절하게 직렬화/이스케이프 처리됩니다.

설명서를 올바르게 읽었는데 거기에 뭔가가있어 parse_str을 끄는 데이터가 숨어있을 수 있습니다. 또한 jQuery에서 게시 한 불법적 인 문자를 찾습니다.

+0

'parse_str'은 수동으로 입력 한 문자열로 잘 동작합니다. 흠 ....'$ _POST [ 'filters']'는';'문자를 포함합니다. 내가 확인한 jQuery 그들을 추가하지 않습니다. –

관련 문제