springMVC通过Filter实现防止xss注入

来源:互联网 发布:大数据 论文 人类 编辑:程序博客网 时间:2024/06/15 15:52

跨站脚本工具(cross 斯特scripting),为不和层叠样式表(cascading style sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。

恶意攻击者往web页面里插入恶意scriptScript代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户

的目的。防止XSS攻击简单的预防就是对Request请求中的一些参数去掉一些比较敏感的脚本命令。

原本是打算通过springMVC的HandlerInterceptor机制来实现的,通过获取request然后对request中的参数进行修改,结果虽然值修改了,但在Controller中获取的数值还是没有修改的。没办法就是要Filter来完成。

简单来说就是创建一个新的httpRequest类XsslHttpServletRequestWrapper,然后重写一些get方法(获取参数时对参数进行XSS判断预防)。

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. @WebFilter(filterName="xssMyfilter",urlPatterns="/*")   
  2. public class MyXssFilter implements Filter{  
  3.   
  4.     @Override  
  5.     public void init(FilterConfig filterConfig) throws ServletException {  
  6.           
  7.     }  
  8.   
  9.     @Override  
  10.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
  11.             throws IOException, ServletException {  
  12.         XsslHttpServletRequestWrapper xssRequest = new XsslHttpServletRequestWrapper((HttpServletRequest)request);  
  13.         chain.doFilter(xssRequest , response);   
  14.     }  
  15.       
  16.     @Override  
  17.     public void destroy() {  
  18.           
  19.     }  
  20.       
  21. }  
XSS代码的过滤是在XsslHttpServletRequestWrapper中实现的,主要是覆盖实现了getParameter,getParameterValues,getHeader这几个方法,然后对获取的value值进行XSS处理。

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. public class XsslHttpServletRequestWrapper extends HttpServletRequestWrapper {  
  2.   
  3.      HttpServletRequest xssRequest = null;    
  4.       
  5.     public XsslHttpServletRequestWrapper(HttpServletRequest request) {  
  6.         super(request);  
  7.         xssRequest = request;  
  8.     }  
  9.       
  10.       
  11.      @Override    
  12.      public String getParameter(String name) {    
  13.           String value = super.getParameter(replaceXSS(name));    
  14.             if (value != null) {    
  15.                 value = replaceXSS(value);    
  16.             }    
  17.             return value;    
  18.      }    
  19.        
  20.      @Override  
  21.     public String[] getParameterValues(String name) {  
  22.          String[] values = super.getParameterValues(replaceXSS(name));  
  23.          if(values != null && values.length > 0){  
  24.              for(int i =0; i< values.length ;i++){  
  25.                  values[i] = replaceXSS(values[i]);  
  26.              }  
  27.          }  
  28.         return values;  
  29.      }  
  30.        
  31.      @Override    
  32.      public String getHeader(String name) {    
  33.         
  34.             String value = super.getHeader(replaceXSS(name));    
  35.             if (value != null) {    
  36.                 value = replaceXSS(value);    
  37.             }    
  38.             return value;    
  39.         }   
  40.      /** 
  41.       * 去除待带script、src的语句,转义替换后的value值 
  42.       */  
  43.     public static String replaceXSS(String value) {  
  44.         if (value != null) {  
  45.             try{  
  46.                 value = value.replace("+","%2B");   //'+' replace to '%2B'  
  47.                 value = URLDecoder.decode(value, "utf-8");  
  48.             }catch(UnsupportedEncodingException e){  
  49.             }catch(IllegalArgumentException e){  
  50.         }  
  51.               
  52.             // Avoid null characters  
  53.             value = value.replaceAll("\0""");  
  54.   
  55.             // Avoid anything between script tags  
  56.             Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);  
  57.             value = scriptPattern.matcher(value).replaceAll("");  
  58.   
  59.             // Avoid anything in a src='...' type of e­xpression  
  60.             scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  61.             value = scriptPattern.matcher(value).replaceAll("");  
  62.   
  63.             scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  64.             value = scriptPattern.matcher(value).replaceAll("");  
  65.   
  66.             // Remove any lonesome </script> tag  
  67.             scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);  
  68.             value = scriptPattern.matcher(value).replaceAll("");  
  69.   
  70.             // Remove any lonesome <script ...> tag  
  71.             scriptPattern = Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  72.             value = scriptPattern.matcher(value).replaceAll("");  
  73.   
  74.             // Avoid eval(...) e­xpressions  
  75.             scriptPattern = Pattern.compile("eval\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  76.             value = scriptPattern.matcher(value).replaceAll("");  
  77.   
  78.             // Avoid e­xpression(...) e­xpressions  
  79.             scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  80.             value = scriptPattern.matcher(value).replaceAll("");  
  81.   
  82.             // Avoid javascript:... e­xpressions  
  83.             scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);  
  84.             value = scriptPattern.matcher(value).replaceAll("");  
  85.             // Avoid alert:... e­xpressions  
  86.             scriptPattern = Pattern.compile("alert", Pattern.CASE_INSENSITIVE);  
  87.             value = scriptPattern.matcher(value).replaceAll("");  
  88.             // Avoid onload= e­xpressions  
  89.             scriptPattern = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  90.             value = scriptPattern.matcher(value).replaceAll("");  
  91.             scriptPattern = Pattern.compile("vbscript[\r\n| | ]*:[\r\n| | ]*", Pattern.CASE_INSENSITIVE);    
  92.             value = scriptPattern.matcher(value).replaceAll("");  
  93.         }             
  94.         return filter(value);  
  95.     }  
  96.           
  97.         /** 
  98.          * 过滤特殊字符 
  99.          */  
  100.         public static String filter(String value) {  
  101.             if (value == null) {  
  102.                 return null;  
  103.             }          
  104.             StringBuffer result = new StringBuffer(value.length());  
  105.             for (int i=0; i<value.length(); ++i) {  
  106.                 switch (value.charAt(i)) {  
  107.                     case '<':  
  108.                         result.append("<");  
  109.                         break;  
  110.                     case '>':   
  111.                         result.append(">");  
  112.                         break;  
  113.                     case '"':   
  114.                         result.append(""");  
  115.                         break;  
  116.                     case '\'':   
  117.                         result.append("'");  
  118.                         break;  
  119.                     case '%':   
  120.                         result.append("%");  
  121.                         break;  
  122.                     case ';':   
  123.                         result.append(";");  
  124.                         break;  
  125.                     case '(':   
  126.                         result.append("(");  
  127.                         break;  
  128.                     case ')':   
  129.                         result.append(")");  
  130.                         break;  
  131.                     case '&':   
  132.                         result.append("&");  
  133.                         break;  
  134.                     case '+':  
  135.                         result.append("+");  
  136.                         break;  
  137.                     default:  
  138.                         result.append(value.charAt(i));  
  139.                         break;  
  140.                 }    
  141.             }  
  142.             return result.toString();  
  143.         }  
  144.       
  145. }  

转载地址:http://blog.csdn.net/qq924862077/
0 0