XSS 대응방안 sanitizer

zion·2023년 11월 12일
0

라이브러리

목록 보기
2/2

JAVA에서 html코드에서 XSS 필터링을 하기 위한 관련 라이브러리를 정리한다.

1) html 코드 html entities 로 치환
2) jsoup
3) OWASP Antisamy
4) NAVER Lucy XSS Filter

1) html entities 으로의 치환은 html tag를 문자열로 전환하여, 태그 역할을 하지 못하도록 한다.

< : &lt;
> : &gt;
" : &quot;
' : &apos;
& : &amp;

이 방법은 html 코드로 스타일이 적용되어야 하는 데이터(ex.에디터) 에는 적합하지 않다. 공격 태그가 아닌 코드는 파싱되어 html 코드로서 작동되어야 한다.

화이트리스트 방식으로 유효하지 않는 html 태그(XSS 의심가능한 코드)들을 문자열로 변경하거나 삭제하는 라이브러리들이 있다.

대표적으로 3) OWASP Antisamy, 4) NAVER Lucy XSS Filter 라이브러리가 검색 결과로 자주 등장했고 Lucy 라이브러리를 먼저 사용해보았다.

  1. NAVER Lucy XSS Filter
  • XssPreventer : 문자열에서 HTML으로 인식될만한 요소를 완전히 제거
  • XssFilter: HTML 요소를 허용하되 XSS 공격에 위험한 요소를 제거

DOM 방식의 XssFilter를 사용했다.

<dependency>
    <groupId>com.navercorp.lucy</groupId>
    <artifactId>lucy-xss</artifactId>
    <version>X.X.X</version>
</dependency>
LucyXssFilter filter = XssFilter.getInstance("lucy-xss.xml");
String clean = filter.doFilter(dirty);

공격 문자는 정확히 필터링 되었지만,
오래된 데이터로 unclosed tag 가 많고 문법적으로 맞지 않는 태그들은 텍스트와 함께 삭제되어, 기존화면과 다른 텍스트/스타일의 화면이 렌더링 되었다.

그렇다고 모든 데이터의 unclosed tag를 변경하고 기존 화면과 비교해 볼수는 없었다.

  1. 유용하지 않는 html 태그의 < 만 regexp 로 변경할까
    어떤 문자 앞의 <를 포함할지, 유용한 html 태그를 따로 설정하는 방식도 맞지 않는 듯하여, 다른 라이브러리를 찾아보기로 했다.

Document unescape 관련 답변을 보고 Document 에 대해 더 알아보던 중 jsoup 라이브러리가 추가로 검색되었다.

  1. jsoup : 자바(Java)로 만들어진 HTML 파서(Parser)
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.10.3</version>
</dependency>
//String clean = Jsoup.clean(htmlDoc, Whitelist.basic());
//String clean = Jsoup.clean(htmlDoc, Whitelist.basicWithImages());
String clean = Jsoup.clean(htmlDoc, Whitelist.relaxed());
//String clean = Jsoup.clean(htmlDoc, Whitelist.simpleText());
//String clean = Jsoup.clean(htmlDoc, Whitelist.none());

unclosed tag가 포함된 코드까지 기존 화면과 동일하게 적용되면서, 정확히 XSS 코드만 삭제 되었다.

추가로 허용할 코드를 커스텀할수도 있다.
https://jsoup.org/apidocs/org/jsoup/safety/Safelist.html

NAVER Lucy XSS Filter 또한 추가 설정으로 jsoup 처럼 HTML 파서와 동일하게 작동 가능한지는 좀더 알아봐야 할것 같다.

profile
be_zion

0개의 댓글