만약 XSS(Cross Site Scripting) 취약점이 발견되어 대응을 해야할 때 각 파라미터별로 원하는 문자를 모두 필터링 걸어준다는 것은 비효율적이라는 생각이 들었다.
그래서 XSS 방어를 위한 관련 라이브러리가 존재하지 않을까하여 찾아본 것을 공유한다.
1. StringEscapeUtils
StringEscapeUtils 클래스는 Apache에서 공식으로 제공해주는 class이다. 해당 클래스에 대한 설명은 다음과 같이 나와있다.
Escape and unescape Strings for Java, Java Script, HTML and XML
설명에서 보는 것처럼 해당 클래스는 HTML 뿐만 아니라 Java, Java Script, XML에 대한 escape와 unescape도 제공을 해주고 있다.
하지만 이번 포스팅의 주제가 XSS인 만큼 HTML에 대한 기능에 대해서만 살펴보도록 하겠다.
◎ escapeHtml3(String input) : HTML entites를 사용하여 String 안의 문자들을 escape한다. HTML version 3.0을 escape하는 translator object이다.
◎ escapeHtml4(String input) : HTML entites를 사용하여 String 안의 문자들을 escape한다. HTML version 4.0을 escape하는 translator object이다.
◎ unescapeHtml3(String input) : entity escapes를 포함하는 문자열을 실제 유니코드 문자들로 entity escapes를 포함하는 문자열을 실제 유니코드 문자가 포함된 문자열로 unescape한다. HTML version 3.0을 unescape하는 translator object이다.
◎ unescapeHtml4(String input) : entity escapes를 포함하는 문자열을 실제 유니코드 문자들로 entity escapes를 포함하는 문자열을 실제 유니코드 문자가 포함된 문자열로 unescape한다. HTML version 4.0을 unescape하는 translator object이다.
간단하게 위의 class를 이용한 코드는 다음과 같다.
import org.apache.common.lang3.StringEscapeUtils;
...
String text = request.getParameter("text");
text = StringEscapeUtils.escapeHtml4(text);
...
2. Lucy-XSS
Lucy-XSS는 naver에서 open source 형태로 제공해주는 XSS 관련 라이브러리이다.
해당 라이브러리에 대한 설명을 보면 이 library 또한 위에서 말한 StringEscapeUtils를 사용했음을 알 수 있다.
Lucy-XSS에는 XssFilter, XssPreventer 두가지가 제공되는데 각각은 다음과 같을 때 사용하라고 명시되어 있다.
◎ XssPreventer : HTML 이외의 간단한 text 파라미터일 때에는 XssPreventer를 사용
◎ XssFilter : 메일, 게시판 등 입력값으로 HTML 태그를 받을 경우에는 XssFilter를 사용
아래는 각각에 대한 간단한 코드이다.
◎ XssPreventer
@Test
public void testXssPreventer() {
String dirty = "\"><script>alert('xss');</script>";
String clean = XssPreventer.escape(dirty);
assertEquals(clean, ""><script>alert('xss');</script>");
assertEquals(dirty, XssPreventer.unescape(clean));
}
◎ XssFilter
@Test
public void testSuperSetFix() {
XssSaxFilter filter = XssSaxFilter.getInstance("lucy-xss-superset-sax.xml");
String expected = "<TABLE class=\"Naver_Layout_Main\" style=\"TABLE-LAYOUT: fixed\" cellSpacing=\"0\" cellPadding=\"0\" width=\"743\">" + "</TABLE>" + "<SPAN style=\"COLOR: #66cc99\"></SPAN>";
String actual = filter.doFilter(clean);
assertEquals(expected, actual);
}
'Develope > JSP' 카테고리의 다른 글
[JSP 보안] Secure Coding (0) | 2018.05.01 |
---|---|
[JSP] kali linux에 JSP 개발환경 세팅 (0) | 2018.03.31 |