팁 & 노하우

|  분야 불문! 어떤 분야든지 자신이 알고 있는 팁이나 노하우를 남겨주세요.

조회 수 714 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

흔히 가장 막기 어렵다고 알려진 공격 중 하나가 XSS(cross-site scripting)입니다. 
간단히 소개하자면 게시물의 제목, 내용 등에 <script> 태그를 넣거나 
또는 그와 비슷한 역할을 하는 onmouseover 이벤트 등을 사용하여 임의의 자바스크립트를 실행하는 공격이지요. 
그래서 대부분의 게시판 솔루션들이 정규식을 사용해서 의심스러운 태그를 걸러내고 있지만, 
그것마저 뚫렸다며 급히 패치를 바란다는 공지사항을 종종 보게 되지요. 

그러나 사실 XSS 필터링은 그렇게 어려운게 아닙니다. 발상이 잘못되었기 때문에 어렵게 보이는 것 뿐입니다. 
이 게시판에도 종종 올라오는 XSS 필터링 라이브러리들, 
그리고 대부분의 공개형 게시판 프로그램들이 사용하는 필터링 알고리듬에는 두 가지 치명적인 허점이 있습니다. 

1. 위험한 태그, 속성, 이벤트만 콕콕 찍어 막으려고 하는 blacklisting 기법을 사용한다. 
2. HTML에 오류가 있거나 웹표준에 어긋나는 태그를 사용한 경우를 감안하지 않는다. 



blacklisting은 수많은 태그, 속성, 이벤트들 중 "위험하다고 알려진" 것들만 블랙리스트에 등록해서 
블랙리스트에 등록된 태그, 속성, 이벤트만 지우고, 나머지는 모두 허용해주는 방법입니다. 
만약 HTML5처럼 새로운 태그나 속성이 생기면 블랙리스트에 아직 없으니 모두 허용해 버리게 됩니다. 
만약 사용하기에 따라 위험할 수도 있는 속성이 블랙리스트에서 빠졌다면 그것도 허용해 버리게 됩니다. 
무엇이 허용되는지조차 분명하지 않으니 자나깨나 땜빵하느라 고생이 많습니다. 

반면, "안전하다고 증명된" 태그, 속성, 이벤트만 화이트리스트(블랙리스트의 반댓말)에 등록해서 
리스트에 등록된 것들만 허용하고 나머지는 죄다 없애버리는 whitelisting 기법을 사용한다면 
새로운 태그나 속성이 추가되더라도 걱정이 없습니다. 



HTML 오류에 신경쓰지 않는 필터링 라이브러리도 문제입니다. 
대부분의 필터링 라이브러리들은 정규식을 사용해서 태그를 걸러내는데, 
중간에 널바이트 또는 공백이 끼어 정규식에 잡히지 않는 엉터리 HTML도 
대부분의 브라우저들은 아무 일 없다는 듯 실행해 주고 있는 것이 현실입니다. 
onmouseover 이벤트는 걸렀지만 on\0mouseover 이벤트는 거르지 못하고, 
javascript: 링크는 잡았지만 java  script: 링크는 잡지 못하는 거죠. 
심지어는 이런 것도 있습니다: <img """><script>alert("XSS")</script>"> 

위와 같은 문제를 해결하려면 태그가 잘못된 것도 걸러내줘야 합니다. 
예를 들어 <img> 태그에 src 속성 대신 스크립트가 들어가 있으면 막아야 하는 거죠. 
잘못된 태그를 다 걸러내주면 짝 없는 <div> 태그 때문에 홈페이지 레이아웃이 깨지는 것도 막을 수 있습니다. 



HTML Purifier는 해외의 보안 전문가들로부터 철저하게 검증받은 필터링 라이브러리입니다. 
whitelisting 기법을 사용하고, 잘못된 태그도 확실하게 걸러내줍니다. 
이걸 사용하면 앞으로 아주 오랫동안 XSS 취약점 걱정은 하지 않아도 됩니다. 
http://htmlpurifier.org/ 

아래의 참고소스 란에 사용방법 예제를 넣었더니 내용이 많아서 그런지, 잘려서 나오네요. 
다른 곳에 올려놓았으니 참고하세요. https://gist.github.com/kijin/5829736 

주의사항: 

1. HTML 소스를 완전히 분해한 후, 안전하다고 검증된 태그, 속성, 이벤트만 다시 조합하여 
안전하고 오류 없는 소스를 생성해 주는 라이브러리입니다. 그만큼 처리속도가 느리다는 점 기억하시고, 
게시물 컨텐츠처럼 반드시 HTML이 필요한 경우에만 사용하세요. 
게시물 제목이나 댓글처럼 HTML이 필요없는 경우 그냥 htmlspecialchars 또는 strip_tags 사용. 
또한 페이지 표시할 때마다 매번 필터링하지 말고, DB에 저장하기 전에 한 번만 필터링하세요. 

2. 문법에 어긋나는 태그는 가차없이 제거하므로, HTML 소스가 아주 심하게 망가져있는 경우 주의하세요. 

3. 첨부파일 업로드를 사용한 XSS 공격은 게시물 내용과 별도로 막아주셔야 합니다. 
    http://www.phpschool.com/link/tipntech/78863 

iframe 동영상 허용 리스트는 이 게시판에 얼마전 레어닉님이 올려주신 라이브러리를 참고했습니다. 
http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=76911 

 


팁 & 노하우

분야 불문! 어떤 분야든지 자신이 알고 있는 팁이나 노하우를 남겨주세요.

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 앞으로 ssh 사용시 한글 사용이 가능합니다. 7 마스터 2018.10.12 12882
공지 접속 불가 사태 수습은 진행중입니다. 35 마스터 2018.10.05 13521
공지 회원 전용 페이지가 생겼습니다. 10 file 마스터 2018.03.20 14134
165 활성 네트워크 이름 바꾸기 1 title: 황금 서버 (30일)하루살이 2017.09.03 745
164 하루에 포인트를 많이 쌓는 법 3 file title: 은메달도다 2017.01.12 211
163 파일질라 최신버전에서 윈도우 비스타를 지원 종료했네요 1 title: 은메달도다 2017.05.27 226
162 파이썬 텔레그램 봇에서 IndexError 해결 방법 2 이니스프리 2018.03.24 209
161 특정사이트 접근제한 하는 방법 1 file title: 은메달대전댁 2016.12.09 252
160 특정 파일을 제외한 현재 디렉토리 내의 모든 파일을 삭제하는 배치파일 이니스프리 2018.10.12 38
159 텍스트 무료 로고 만들기 사이트 4 오후두시스토리 2017.04.05 663
158 크롬에서 스타벅스 와이파이 자동 로그인해주는 확장 프로그램 1 블루블루 2017.06.06 331
157 크롬 69 업데이트 전후로 자주가는 페이지가 안나오는 경우 8 file 맛스타 2018.09.08 93
156 직구나 프로그램 다운로드시 사용 가능한 무료 해외 SMS 수신 사이트 8 이니스프리 2017.12.09 795
155 제가 알고 있던 통신사 계약기간 만료시 꿀팁을 공개합니다! 3 title: 열려라 맛스타의 자물쇠TVJ 2017.08.21 325
154 작업 관리자의 CPU 이름 바꾸기 1 title: 황금 서버 (30일)하루살이 2017.09.03 979
153 일부사이트에서 막은 우클릭 해제하기 (즐겨찾기 이용) 슬기 2018.10.06 43
152 인증서 설치하신분들중 WoSign, StartSSL 인증서를 사용하시는분들은 봐주세요 3 title: YJSoft 로고YJSoft 2016.10.01 271
151 이북 무료 제공 - JavaScript: Novice to Ninja 4 이니스프리 2017.11.09 296
150 이것 7가지 지키면 미세먼지 노출 줄일 수 있다! 오후두시스토리 2017.04.06 102
149 유튜브 영상 다운로드 하는 요령 2 오후두시스토리 2017.04.08 273
148 유튜브 단축키를 정리해봤습니다 (+이스터 에그) 2 이니스프리 2018.09.26 46
147 윈도우에서 Jupyter Notebook 설치 및 기본설정 이니스프리 2018.09.25 46
146 윈도우 작업 스케줄러에서 특정 작업이 실행 안 되는 경우 해결방법 (배치파일 등의 상대경로 관련) 2 file 이니스프리 2018.10.02 77
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9
서버에 요청 중입니다. 잠시만 기다려 주십시오...