질문
Q #8851
ajax를 사용하거나 form으로 url정보를 넘길경우 & 파싱 오류
조현
2010-03-10 16:14:20
특정 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); 로 변경해도 되지만...
마음에 쏘옥 드는 해결방법이 없을까요? ㅡ.ㅡ
저는 이렇게 나오던데요..
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; }이렇게 해도 별 문제 없어 보이는데요....