XSS?
Cross-Site Scripting 의 준말입니다.
유형과 예시 - 위키백과
"사용자를 믿지 마라.""XSS는 인터넷 시간으로 고대의 유물에 속한, 잘 알려진 공격 요소다. 이 공격을 막지 못한다면 업무 태만이다."
적용
과거 코드들을 보면 HttpServletRequestWrapper 를 상속해서 아래와 같이 처리하는 것을 종종 볼 수 있습니다.
public String[] getParameterValues(String parameter) { String[] values = super.getParameterValues(parameter); if (values == null) { return null; } for (int i = 0; i < values.length; i++) { if (values[i] != null) { StringBuffer strBuff = new StringBuffer(); for (int j = 0; j < values[i].length(); j++) { char c = values[i].charAt(j); switch (c) { case '<': strBuff.append("<"); break; case '>': strBuff.append(">"); break; case '&': strBuff.append("&"); break; case '"': strBuff.append("""); break; case '\'': strBuff.append("'"); break; default: strBuff.append(c); break; } } values[i] = strBuff.toString(); } else { values[i] = null; } } return values; } | cs |
요즘은 NAVER 형님의 lucy-xss-servlet-filter 를 많이 쓰더라구요
(포스팅하기 민망할 정도로 한글로 잘 되어있음 ㅠㅠ 네이버 합시다)
pom.xml
<dependency> <groupId>com.navercorp.lucy</groupId> <artifactId>lucy-xss-servlet</artifactId> <version>2.0.0</version> </dependency> | cs |
web.xml
<!-- XSS filter --> <filter> <filter-name>xssEscapeServletFilter</filter-name> <filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class> </filter> <filter-mapping> <filter-name>xssEscapeServletFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> | cs |
규칙 추가
/resources 폴더 아래 lucy-xss-servlet-filter-rule.xml 파일을 생성합니다.
모든 옵션에 대한 예시는
<?xml version="1.0" encoding="UTF-8"?> <config xmlns="http://www.navercorp.com/lucy-xss-servlet"> <defenders> <!-- XssPreventer 등록 --> <defender> <name>xssPreventerDefender</name> <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssPreventerDefender</class> </defender> <!-- XssSaxFilter 등록 --> <defender> <name>xssSaxFilterDefender</name> <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssSaxFilterDefender</class> <init-param> <param-value>lucy-xss-sax.xml</param-value> <!-- lucy-xss-filter의 sax용 설정파일 --> <param-value>false</param-value> <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 --> </init-param> </defender> <!-- XssFilter 등록 --> <defender> <name>xssFilterDefender</name> <class>com.navercorp.lucy.security.xss.servletfilter.defender.XssFilterDefender</class> <init-param> <param-value>lucy-xss.xml</param-value> <!-- lucy-xss-filter의 dom용 설정파일 --> <param-value>false</param-value> <!-- 필터링된 코멘트를 남길지 여부, 성능 효율상 false 추천 --> </init-param> </defender> </defenders> <!-- default defender 선언, 별다른 defender 선언이 없으면 default defender를 사용해 필터링 한다. --> <default> <defender>xssPreventerDefender</defender> </default> <!-- global 필터링 룰 선언 --> <global> <!-- 모든 url에서 들어오는 globalParameter 파라메터는 필터링 되지 않으며 또한 globalPrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. --> <params> <param name="globalParameter" useDefender="false" /> <param name="globalPrefixParameter" usePrefix="true" useDefender="false" /> </params> </global> <!-- url 별 필터링 룰 선언 --> <url-rule-set> <!-- url disable이 true이면 지정한 url 내의 모든 파라메터는 필터링 되지 않는다. --> <url-rule> <url disable="true">/disableUrl1.do</url> </url-rule> <!-- url1 내의 url1Parameter는 필터링 되지 않으며 또한 url1PrefixParameter로 시작하는 파라메터도 필터링 되지 않는다. --> <url-rule> <url>/url1.do</url> <params> <param name="url1Parameter" useDefender="false" /> <param name="url1PrefixParameter" usePrefix="true" useDefender="false" /> </params> </url-rule> <!-- url2 내의 url2Parameter1만 필터링 되지 않으며 url2Parameter2는 xssSaxFilterDefender를 사용해 필터링 한다. --> <url-rule> <url>/url2.do</url> <params> <param name="url2Parameter1" useDefender="false" /> <param name="url2Parameter2"> <defender>xssSaxFilterDefender</defender> </param> </params> </url-rule> </url-rule-set> </config> | cs |
적용결과
적용 전의 쿼리입니다.
적용 후에는 이스케이프 된 것을 확인.
게시물을 읽으면 정상적으로 보여집니다.