티스토리 뷰
오늘 처리한 이슈는 사용자의 입력 내용과 출력 내용이 다른 부분에 관한 것이었다. 원인은 입력 내용을 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>' 와 같은 형식으로 필터링을 하게 되면 대소문자 변환 등을 이용해 쉽게 회피 가능하기 때문에 주의 해야 한다. 가장 보편적인 방법은 '<'를 '<' 로 '>'를 '>'로 변환하는 것이다.
<script>
...
$("#examText").html(" ... \n ... \n ..."
.replace(/</gi,"<").replace(/>/gi,">")
.replace(/\n/gi,"<br>"));
...
</script>
웹 애플리케이션을 개발하게 되면 이런 코드가 계속해서 등장하게 되므로 해당하는 코드를 처리하는 함수나 객체를 만들어 두면 편리할 것이다.
물론 브라우저 마다 다르겠지만 요즘은 브라우저에서 이 공격을 일부분 막아주기도 한다고 한다. 그러나 웹 개발시에는 반드시 XSS에 대한 방어를 해야한다.
'in office' 카테고리의 다른 글
Several ports required by Tomcat Server at localhost are already in use. (0) | 2019.05.23 |
---|---|
꼭 클라이언트/서버 양측에서 유효성 검사를 하자 (0) | 2019.05.14 |
이클립스에서 서버 timeout 시간 늘이는 법 (0) | 2019.05.07 |
DOM에 dependent하게 프로그램 하지 말자 (0) | 2019.05.03 |
SQL로 중복된 값이 있는지 찾기?(COUNT, GROUP BY 사용) (0) | 2019.04.26 |
- Total
- Today
- Yesterday
- java
- was
- Count
- 경고
- 크롬
- 동적계획법
- DP
- 디자인패턴
- Markov
- REST API
- 문장 생성기
- 전략패턴
- Spring in Action
- GROUP BY
- 자바스크립트개론
- CONVENTIONS
- 마르코프
- 마르코프 연쇄
- 클린코드
- 로그
- html
- 야근
- Warning
- markov chain
- RESTful
- 코딩의 기술
- 자바스크립트 개론
- restful api
- 유지보수
- 몰라서망신
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |