티스토리 뷰

program

[ JSP ] XSS Filter

littlecarbb 2013. 7. 11. 11:39

출처 : http://shonm.tistory.com/entry/JSP-XSS-Filter



웹 페이지 입력 란에

 

<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.

 

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

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함