CI 묻고 답하기

제목 ajax를 사용하거나 form으로 url정보를 넘길경우 & 파싱 오류
글쓴이 조현 작성시각 2010/03/10 16:14:20
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 28194   RSS
조현
 특정 url을 ajax 나 form으로 POST 메소드로 전송시 

Ex) http%3A%2F%2Fwww.enclean.com%2Fbbs%2Fboard%2Fpublicucc.view.form.do%3FmsgId%3D71815%26messageNumber%3D0%26boardId%3D123%26boardName%3D%26messageCategoryId%3D0%26startId%3D%26startPage%3D%26searchTitleFlag%3D%26searchRegisterNicknameFlag%3D%26lastPageFlag%3D%26lastPageFlag%3D339%26publicUcc%3DpublicUcc%26publicCateId%3D1052%26leftPublicCateId%3D1052%26leftPublicCateName%3D%26leftChildPublicCateId%3D%26leftChildPublicCateName%3D%26publicCateName%3D%EB%BB%94Fun%ED%95%9C+%EB%8F%99%EC%98%81%EC%83%81%26leftpage%3D%26currentRead%3D1%26listUrl%3Dhttp%3A%2F%2Fwww.enclean.com%2Fbbs%2Fboard%2Fpublicucc.list.form.do%26searchType%3D1%26searchTe

결과물이 
http://www.enclean.com/bbs/board/publicucc.view.form.do?msgId=71815&messageNumber;=0&boardId;=123&boardName;=&messageCategoryId;=0&startId;=&startPage;=&searchTitleFlag;=&searchRegisterNicknameFlag;=&lastPageFlag;=&lastPageFlag;=339&publicUcc;=publicUcc&publicCateId;=1052&leftPublicCateId;=1052&leftPublicCateName;=&leftChildPublicCateId;=&leftChildPublicCateName;=&publicCateName;=뻔Fun한 동영상&leftpage;=¤tRead;=1&listUrl;=http://www.enclean.com/bbs/board/publicucc.list.form.do&searchType;=1&searchText;=

$this->input->post('url'); 사용 시 위의 결과물이 나옵니다.
Input Class 중 xss_clean Method 에서 line 566

$str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', "\\1;\\2", $str);

& amp;key=value => &key;=value 이렇게 파싱을 합니다.
&key=value => &key;=value 이렇게도 파싱을 하네요.


여기서 문제가발생하는데요

$str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', "\\1\\2", $str);

& amp;key=value => &key=value 이렇게 파싱을 합니다.

======
하지만 이게 url query 를 파싱하니늑 아니라 post로 넘어오 결과를 파싱하는 경우라 

&0123456789abcdefghijklmnopqrstuvwxyz; => &

위의 경우처럼 사용자 임의로 입력된 내용도 위 처럼 변경될 문제가 있을 수 있겠죠...

url 이니 결과물에서 str_replace(';=', '=', $str); 로 변경해도 되지만...

마음에 쏘옥 드는 해결방법이 없을까요? ㅡ.ㅡ



태그 &,&,post,preg_replace,;=
 다음글 참조연산자 다시 질문드려봅니다. ^^; (2)
 이전글 euc-kr을 사용할 경우 (3)

댓글

헛발이 / 2010/03/10 16:28:14 / 추천 0
위의 URL문장을 긁어서 form으로 post로 넘겨 받아서 화면에 찍어 봤는데요...
저는 이렇게 나오던데요..


http://www.enclean.com/bbs/board/publicucc.view.form.do?msgId=71815& messageNumber=0&boardId=123&boardName=&messageCategoryId=0& amp;startId=&startPage=&searchTitleFlag=& searchRegisterNicknameFlag=&lastPageFlag=&lastPageFlag=339& publicUcc=publicUcc&publicCateId=1052&leftPublicCateId=1052& leftPublicCateName=&leftChildPublicCateId=& leftChildPublicCateName=&publicCateName=뻔Fun한+동영상&leftpage=& currentRead=1&listUrl=http://www.enclean.com/bbs/board/publicucc.list.form.do&searchType=1&searchTe />

;가 없이 나오던데요...

혹시 버젼에 문제있는건 아니겠죠? 저는 1.7.2 사용중이구요..

post로 넘겨 받을때
$this->form_validation->set_rules('testurl', '테스트URL', 'trim|xss_clean');
if ($this->form_validation->run()) {
    echo $this->input->post('testurl');
    exit;
}
이렇게 했거든요...

$this->form_validation->set_rules('testurl', '테스트URL', 'trim|xss_clean');
if ($this->form_validation->run()) {
    echo $this->form_validation->set_value('testurl');
    exit;
}

이렇게 해도 별 문제 없어 보이는데요....
변종원(웅파) / 2010/03/10 23:12:04 / 추천 0
푸름바람님 하이~ 변팀장입니다. ㅋ
봉남이 / 2010/03/14 17:47:50 / 추천 0
아 저도 동일한 문제를 겪은적 있습니다.
echo $this->input->post('testurl');
이걸
echo $this->input->post('testurl', false); // 요케해서 xss 필터링을 무시해주고 해결했습니다; 좀 찝찝은 하지만 쿼리문은 어차피 이그나이터가 escape 이런처리를 해줄거니.. 믿고말이죠 ㅡㅡㅋ
원인은 xss 필터링과정에서 발생하는것 같았어요 ㅠ