PHP - HTML 에디터 사용시 XSS를 막자

요즘 게시판이나 기타 싸이트를 만들면서 HTML 에디터를 많이 사용할 것이다.(TinyMCE, FCKEditor 등)
그런데, 이런 에디터를 무턱대고 사용하는 99%는 Cross site scripting(XSS) 해킹의 목표가 된다.(XSS공격방법예제)
이러한 에디터들을 사용하면 당연히 HTML을 화면상에 그대로 출력해야 하므로, 그 HTML에 javascript를 호출하는 href="javascript:functioncall();"이나 onload="functioncall();" 같은 HTML 태그의 속성들이 같이 끼어들어갈 수 있게 된다. 심하면 <script>이 대 놓고 들어가지는 경우도 있고..

물론 에디터를 사용해서 작성하면 이러한 공격성 코드를 모두 제거해 준다(최소한 TinyMCE는 그렇다).
하지만, 웹의 특성상, POST, GET 요청을 굳이 웹 브라우저에서하지 않고(즉, Javascript를 거치지 않고) 바로 요청을 서버에 전송하는 것이 가능하므로, 클라이언트측의 유효성 검사만 믿고 입력내용을 그대로 화면에 뿌려주면 바로 XSS 공격대상으로 전락하게 된다.

서론이 길다...

PHP에 TinyMCE를 사용하면서 이걸 어찌 해결하나 하다가(구체적으로 말하면 어떤 정규 표현식을 써서 해결하지?? 하고 머리굴리다가) 찾은 것... kses
원하는 태그와 불필요한 속성들(onload, onclick 등)을 모두 제거하고 원하는 태그들만 남겨두는 라이브러리이다.

사용법도 간단하다.. README 파일을 읽어보라..
<?php

include 'kses.php';

$allowed = array('b' => array(),
                 'i' => array(),
                 'a' => array('href' => 1, 'title' => 1),
                 'p' => array('align' => 1),
                 'br' => array());

$val = $_POST['val'];
if (get_magic_quotes_gpc())
  $val = stripslashes($val);
# You must strip slashes from magic quotes, or kses will get confused.

$val = kses($val, $allowed); # The filtering takes place here.

# Do something with $val.

?>


중간에 stripsplashes($val)부분도 중요하다. get_magic_quotes_gpc()가 true일 경우에는 따옴표에 붙은 특수문자를 꼭 제거 한뒤에 이 라이브러리를 사용할 것.

HTML 에디터를 통해 들어온 모든 데이터를 kses 라이브러리에 통과시켜서 공격성 코드를 모두 제거해서 저장한다.

이건 물론 PHP에만 해당하는게 아니다. 모든 언어에 다 해당하는 것이다.

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 소심이 | 2007/12/27 15:32 | 느린나무의 Program | 트랙백 | 덧글(1)

트랙백 주소 : http://daenamoo09.egloos.com/tb/1196847
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by Joo8111 at 2007/12/27 22:19
옷! 좋은 정보 감사합니다.
※ 로그인 사용자만 덧글을 남길 수 있습니다.

◀ 이전 페이지          다음 페이지 ▶