- Published on
XSS와 sanitize-html
Cross-Site Scripting (XSS) (크로스 사이트 스크립팅)
- 신뢰할 수 없는 데이터가 응용 프로그램의 새 웹 페이지에 포함되거나 사용자가 제공한 데이터로 JavaScript 작성 기능이 있는 브라우저 API를 사용하여 기존의 웹 페이지가 업데이트될 때 발생하는 취약점
- 침입자는 이 방법을 통해서 브라우저에 스크립트를 삽입하고 실행할 수 있다.
- 공격자가 희생자의 브라우저 사용자 세션을 도용하거나, 웹 사이트를 변조시키거나, 악성 사이트로 리다이렉션 시킴
대응 (sanitize-html)
게시판이라는 웹 서비스가 있을 때, 누군가가 본문의 내용으로 <script> 공격 코드 </script> 를 작성했다고 생각해보자.
서버 단에서 아무런 조치를 취하지 않았다면, 다른 서비스 이용자가 해당 게시물에 접근했을 때 곧바로 공격이 이루어질 수 있다.
따라서 <script>와 같은 위험한 태그들을 사전에 예방해야 한다.
XSS를 막는 방법으로 Parameter, input 등의 입력값을 제한하거나, 입력된 특수문자를 치환하는 방법이 있다.
치환된 문자는 브라우저가 렌더링하여 특수문자로 보여지지만 스크립트로 실행되지 않게 방어할 수 있다.
< → <
> → >
" → "
' → '
JS에서 XSS에 대응하기 위한 모듈로 sanitize-html이 있다.
sanitize-html은 script 태그를 제거하고 HTML 태그를 허용하는 경우에는 화이트리스트를 선정하여 해당 Tag 및 Attribute만 입력 가능하도록 설정하는 기능 등이 있다.
웹프론트와 NodeJS에서 모두 사용할 수 있다.
import sanitizeHtml from 'sanitize-html';
var dirty = '<script>some really tacky HTML<' + '/script><h1>H1 Title</h1>';
console.log(dirty);
var clean1 = sanitizeHtml(dirty);
console.log(clean1);
var clean2 = sanitizeHtml(dirty, {
allowedTags: ['b', 'i', 'em', 'strong', 'a', 'h1'],
allowedAttributes: {
a: ['href'],
},
allowedIframeHostnames: ['www.youtube.com'],
});
console.log(clean2);
// <script>some really tacky HTML</script><h1>H1 Title</h1>
// H1 Title
// <h1>H1 Title</h1>