티스토리 뷰

donaricano-btn
반응형

오늘 처리한 이슈는 사용자의 입력 내용과 출력 내용이 다른 부분에 관한 것이었다. 원인은 입력 내용을 text로 화면에 뿌리다 보니 개행문자가 무시되어서 한 줄로 표기 된 부분이다. 간단히 개행문자를 <br> 태그로 바꿔서 해결할 수가 있었다.

<script>
	
    ...
    // 수정 전
    $("#examText").text(" ... \n ... \n ...");
    
    // 수정 후
    $("#examText").html(" ... \n ... \n ...".replace(/\n/gi,"<br>"));

	...
</script>

이렇게 코드를 바꾸면 문제없이 개행문자를 처리할 수 있다. 그런데 문제가 있다. 만약 사용자가 임의로 태그를 입력하게 된다면 어떻게 될까? 경우에 따라서는 페이지가 깨지거나 심각한 오류를 발생시키기도 할 것이다. 만약 스크립트를 삽입하게 된다면 이를통해 다른 사용자를 방해하거나 개인정보 등을 탈취하는 경우도 있을 수 있다.

 

이렇게 악의적인 스크립트에 의해 페이지가 깨지거나 다른 사용자의 사용을 방해하거나 쿠키 혹은 다른 개인정보를 빼 가는 공격을 Cross Site Scripting(XSS)라고 한다. 개발자는 당연히 이런 공격을 미리 대비하고 있어야 한다.

 

악성 스크립트를 서버에 저장시켜 클라이언트가 해당 페이지를 열람할 때 악성 스크립트를 실행시키는 Stored XSS(=Persistent XSS), 서버에 저장하지 않고 곧바로 클라이언트로 반환되는 Reflected XSS 취약점(=Non-Persistent XSS), DOM(Document Object Model)객체를 포함하는 자바스크립트 등을 이용하여 검증되지 않은 입력값을 삽입하게 하는 DOM XSS 등 XSS 를 이용한 공격은 다양한 형태가 있을 수 있다.

 

그러나 대부분의 XSS가 태그를 통해 입력되어 실행 되는 것이 원인이기 때문에 해당 문자열을 다른 문자열로 변환하게 되면 비교적 간단하게 방어를 할 수 있다. 

 

그러나 태그 이름 가령 예를 들어 '<script>' 와 같은 형식으로 필터링을 하게 되면 대소문자 변환 등을 이용해 쉽게 회피 가능하기 때문에 주의 해야 한다. 가장 보편적인 방법은 '<'를 '&lt;' 로 '>'를 '&gt;'로 변환하는 것이다.

<script>

    ...
    $("#examText").html(" ... \n ... \n ..."
        .replace(/</gi,"&lt").replace(/>/gi,"&gt")
        .replace(/\n/gi,"<br>"));
    
    ...
</script>

웹 애플리케이션을 개발하게 되면 이런 코드가 계속해서 등장하게 되므로 해당하는 코드를 처리하는 함수나 객체를 만들어 두면 편리할 것이다. 

 

물론 브라우저 마다 다르겠지만 요즘은 브라우저에서 이 공격을 일부분 막아주기도 한다고 한다. 그러나 웹 개발시에는 반드시 XSS에 대한 방어를 해야한다.

반응형
donaricano-btn
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함