본문 바로가기

Java/Spring

spring xss filter

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("&lt;");
                        break;
                    case '>':
                        strBuff.append("&gt;");
                        break;
                    case '&':
                        strBuff.append("&amp;");
                        break;
                    case '"':
                        strBuff.append("&quot;");
                        break;
                    case '\'':
                        strBuff.append("&apos;");
                        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

적용결과

적용 전의 쿼리입니다.


적용 후에는 이스케이프 된 것을 확인.


게시물을 읽으면 정상적으로 보여집니다.