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


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

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

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



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

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

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


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


1. CrossScriptingFilter 필터 파일
2. RequestWrapper  필터링을 실행할 파일
3. web.xml 에서 세팅
=================================================================================

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

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

===========================================================

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




필요하다면 RequestWrapper  해당 클래스 파일에서 수정이 가능하다

 web.xml 에 추가할때 자신의 package 로 변경하는거 잊지 않도록 한다




PS. 
블로그에 소스코드 올릴때 http://qbnz.com/highlighter/index.php  요기 이용하면 위에처럼 이쁘게 나온다 
아..지금까지 삽질했다....
우측하단에 Domonstration 에 코드 넣고 언어 선택하고 Highlight 버튼 클릭!

PS 2.
이런...좌우측이 화면에 짤리네;;; 헐...복사하면 보이긴하니까 다행;;;      


블로그 이미지

532

처음 프로그래밍을 시작한 개발자들은 Hello World!를 기억 할 것이다. Hello world가 Hell World가 될 줄 몰랐던 한 개발자의 이야기. 게시글의 출처를 표기하며, 출처를 남기지 않고 펌을 하는것에 대해 법적 책임을 묻지 않습니다.

,