본문 바로가기
JSP

[ JSP ] XSS Filter

by 정윤재 2012. 8. 10.

웹 페이지 입력 란에

 

<script> alert('1111'); </script>

 

이런 식으로 입력을 하면 입력 정보를 불러 올 때 alert 가 뜨게 될 수 있는데...

 

이게 악성 스크립트를 전송 하여 클릭 시 PC 의 인증 정보를 수집하여

 

공격하는 Cross Site Scripting 이 가능 하다고 본다고 한다.

 

그래서 < , > 등을 입력 받지 못하도록 막아야 한다고 대형 사이트의 보안 권고

 

사항이 나온다.

 

JSP 개발 상황이라면 class 2개 를 만들고 web.xml 에 간단한 filter 추가로

 

해결 할 수 있다.

 

일단 servlet-api.jar 파일을 lib 폴더에 넣는다. (tomcat 등에 있다.)

 

그 다음 class 2 개를 추가 한다.

 

추가 해야 할 class 1

 

package com.incross.util;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public 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;    
  
 }
}

 

 

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

추가 해야 할 class 2

 

package com.incross.util;

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 FilterConfig filterConfig;
 
 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);    
 }
 
}

 

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

web.xml 에 추가 해야 할 사항

 

<filter>    
 <filter-name>XSS</filter-name>    
 <filter-class>com.incross.util.CrossScriptingFilter</filter-class>
</filter>

<filter-mapping>    
 <filter-name>XSS</filter-name>    
 <url-pattern>/*</url-pattern>
</filter-mapping>

 

위의 사항들만 추가 해 주면 해결 된다.

 

 

소스 출처 사이트

http://webcache.googleusercontent.com/search?q=cache:OBsUhdW4E2YJ:greatwebguy.com/programming/java/simple-cross-site-scripting-xss-servlet-filter/+xss+filter+java&cd=1&hl=ko&ct=clnk&gl=kr.

 

(참고로 출처 사이트는 영어 입니다^^)


댓글