빠른 확인
먼저 입력값이 어느 문맥에 출력되는지 확인한다. 같은 문자열도 HTML 본문, 속성, JavaScript 문자열, URL 문맥마다 필요한 검증 방식이 다르다.
<script>alert(1)</script>
"><script>alert(1)</script>
HTML 본문
<img src=x onerror=alert(1)>
태그가 그대로 렌더링되는지, HTML entity로 인코딩되는지 확인한다.
HTML 속성
" autofocus onfocus=alert(1) x="
따옴표 탈출 가능성과 이벤트 핸들러 삽입 가능성을 본다.
JavaScript 문자열
';alert(1);//
문자열 종료, escape 처리, template literal 문맥을 구분해서 확인한다.
URL 문맥
javascript:alert(1)
링크, 리다이렉트, 이미지 URL처럼 URL이 들어가는 위치에서 스킴 제한이 적용되는지 확인한다.
방어 메모
입력 필터링보다 출력 문맥별 인코딩을 우선한다. 사용자 HTML을 허용해야 한다면 sanitizer allowlist를 사용하고, CSP로 inline script 실행을 제한한다.