반응형


-XSS 필터



웹 페이지를 만들보면 사용자의 악의적인 공격을 많이 받게되는데



이런 것들중 가장 대표적인것이 XSS 공격이다


크로스 사이트 스크립트 라는것인데 서버로 보내는 입력값에 자바스크립트를 보내서


다른 사용자에게 자신이 만든 스크립트를 실행시켜서 사용자의 정보를 빼내는것이다




지금 당장 자신의 사이트가 XSS 를 방어하고 있는지 확인하는 방법은 간단하다


입력창 아무대서나 <script> alert("script ok"); </script> 라고 입력하고


저장한 후 상세화면으로 들어갔을때 해당 코드가 실행되는지 확인하면 간단하다



이런 문제를 해결하는데에는 많은 방법이 있지만 간단하게 Filter 추가 만으로 해결할 수 있는 방법이 있다


1. CrossScriptingFilter 필터 파일

2. RequestWrapper  필터링을 실행할 파일

3. web.xml 에서 세팅


1. 기본 컨트롤 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
package com.greatwebguy.filter;
 
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
 
 
public class CrossScriptingFilter implements Filter {
 
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }
 
    public void destroy() {
        this.filterConfig = null;
    }
 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
 
        chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);
 
    }
 
}
cs




2. 치환 동작 메서드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package com.greatwebguy.filter;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
 
public final class RequestWrapper extends HttpServletRequestWrapper {
 
    public RequestWrapper(HttpServletRequest servletRequest) {
        super(servletRequest);
    }
 
    public String[] getParameterValues(String parameter) {
 
      String[] values = super.getParameterValues(parameter);
      if (values==null)  {
                  return null;
          }
      int count = values.length;
      String[] encodedValues = new String[count];
      for (int i = 0; i < count; i++) {
                 encodedValues[i] = cleanXSS(values[i]);
       }
      return encodedValues;
    }
 
    public String getParameter(String parameter) {
          String value = super.getParameter(parameter);
          if (value == null) {
                 return null;
                  }
          return cleanXSS(value);
    }
 
    public String getHeader(String name) {
        String value = super.getHeader(name);
        if (value == null)
            return null;
        return cleanXSS(value);
 
    }
 
    private String cleanXSS(String value) {
                //You'll need to remove the spaces from the html entities below
        value = value.replaceAll("<""& lt;").replaceAll(">""& gt;");
        value = value.replaceAll("\\(""& #40;").replaceAll("\\)""& #41;");
        value = value.replaceAll("'""& #39;");
        value = value.replaceAll("eval\\((.*)\\)""");
        value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
        value = value.replaceAll("script", "");
        return value;
    }
}
cs



3.(<filter-class> 에는 해당 클래스 파일 경로를 넣어야한다)

1
2
3
4
5
6
7
8
9
 
<filter>
    <filter-name>XSS</filter-name>
    <filter-class>com.greatwebguy.filter.CrossScriptingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>XSS</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
cs




-URIEncodin 필터


Tomcat에서 한글 encoding을 설정하는 방법은 요청 메써드 (GET or POST)에 따라 다르다.

get 방식

Tomcat의 sever.xml 을 열고 

1
2
3
4
<Connector port="9090" protocol="HTTP/1.1" 
                 connectionTimeout="20000" 
                redirectPort="8443"
                URIEncoding="utf-8" />
cs


위 URIEncoding 부분을 추가했다.. 그러니 한글이 깨지는 것을 막을 수 있었다.
기본적으로 톰캣은 ISO-8859-1 인코딩 한다.
그래서 한글이 깨졌던거 같다.

post 방식

web.xml 아래와 같이 filter class 를 등록한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 <filter>
  <filter-name>Set Character Encoding</filter-name>
  <filter-class>filters.SetCharacterEncodingFilter</filter-class>
  <init-param>
   <param-name>encoding</param-name>
   <param-value>utf-8</param-value>
  </init-param>
 </filter>
 
 <filter-mapping>
  <filter-name>Set Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>
 
 <filter-mapping>
   <filter-name>encodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>
 
 
cs





출처 사이트:

http://18281818.tistory.com/76 [반이라도 이해하자]

http://kcmuni.tistory.com/entry/한글-깨짐-처리URIEncodingUTF-8 [내일을 항해~]


반응형

+ Recent posts