利用简单的过滤器 过滤特殊字符实现 防止XSS攻击

利用简单的过滤器 过滤特殊字符实现 防止XSS攻击



web.xml配置文件 


  1.  <filter>  
  2.   <filter-name>XSSFilter</filter-name>  
  3.   <filter-class>com.neusoft.common.filter.XSSFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.   <filter-name>XSSFilter</filter-name>  
  7.   <url-pattern>/*</url-pattern>  
  8. </filter-mapping>  


  1. package com.neusoft.common.filter;  
  2.   
  3.   
  4. import java.io.IOException;  
  5.   
  6. import javax.servlet.Filter;  
  7. import javax.servlet.FilterChain;  
  8. import javax.servlet.FilterConfig;  
  9. import javax.servlet.ServletException;  
  10. import javax.servlet.ServletRequest;  
  11. import javax.servlet.ServletResponse;  
  12. import javax.servlet.http.HttpServletRequest;  
  13.   
  14. public class XSSFilter implements Filter {  
  15.   
  16.     @Override  
  17.     public void destroy() {  
  18.         // TODO Auto-generated method stub  
  19.   
  20.     }  
  21.   
  22.     @Override  
  23.     public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)  
  24.             throws IOException, ServletException {  
  25.         // TODO Auto-generated method stub  
  26.         arg2.doFilter(new XSSRequestWrapper((HttpServletRequest) arg0), arg1);  
  27.     }  
  28.   
  29.     @Override  
  30.     public void init(FilterConfig arg0) throws ServletException {  
  31.         // TODO Auto-generated method stub  
  32.   
  33.     }  
  34.   
  35. }  



  1. package com.neusoft.common.filter;  
  2.   
  3.   
  4. import java.util.regex.Pattern;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletRequestWrapper;  
  8.   
  9.   
  10. public class XSSRequestWrapper extends HttpServletRequestWrapper {  
  11.   
  12.     public XSSRequestWrapper(HttpServletRequest request) {  
  13.         super(request);  
  14.     }  
  15.   
  16.     @Override  
  17.     public String[] getParameterValues(String parameter) {  
  18.         String[] values = super.getParameterValues(parameter);  
  19.         if (values == null) {  
  20.             return null;  
  21.         }  
  22.         int count = values.length;  
  23.         String[] encodedValues = new String[count];  
  24.         for (int i = 0; i < count; i++) {  
  25.             encodedValues[i] = stripXSS(values[i]);  
  26.         }  
  27.         return encodedValues;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String getParameter(String parameter) {  
  32.         String value = super.getParameter(parameter);  
  33.         return stripXSS(value);  
  34.     }  
  35.   
  36.     @Override  
  37.     public String getHeader(String name) {  
  38.         String value = super.getHeader(name);  
  39.         //return stripXSS(value);  
  40.         return value;  
  41.     }  
  42.       
  43.     public String getQueryString() {    
  44.         String value = super.getQueryString();    
  45.         if (value != null) {    
  46.             value = stripXSS(value);    
  47.         }    
  48.         return value;    
  49.     }    
  50.   
  51.     private String stripXSS(String value) {  
  52.         if (value != null) {  
  53.             // Avoid anything between script tags  
  54.             Pattern scriptPattern = Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE);  
  55.             value = scriptPattern.matcher(value).replaceAll("");  
  56.             // Avoid anything in a  
  57.             // e­xpression  
  58.             scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\'(.*?)\\\'",  
  59.                     Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  60.             value = scriptPattern.matcher(value).replaceAll("");  
  61.             scriptPattern = Pattern.compile("src[\r\n]*=[\r\n]*\\\"(.*?)\\\"",  
  62.                     Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  63.             value = scriptPattern.matcher(value).replaceAll("");  
  64.             // Remove any lonesome </script> tag  
  65.             scriptPattern = Pattern.compile("</script>", Pattern.CASE_INSENSITIVE);  
  66.             value = scriptPattern.matcher(value).replaceAll("");  
  67.             // Remove any lonesome <script ...> tag  
  68.             scriptPattern = Pattern.compile("<script(.*?)>",  
  69.                     Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  70.             value = scriptPattern.matcher(value).replaceAll("");  
  71.             // Avoid eval(...) e­xpressions  
  72.             scriptPattern = Pattern.compile("eval\\((.*?)\\)",  
  73.                     Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  74.             value = scriptPattern.matcher(value).replaceAll("");  
  75.             // Avoid e­xpression(...) e­xpressions  
  76.             scriptPattern = Pattern.compile("e­xpression\\((.*?)\\)",  
  77.                     Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  78.             value = scriptPattern.matcher(value).replaceAll("");  
  79.             // Avoid javascript:... e­xpressions  
  80.             scriptPattern = Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE);  
  81.             value = scriptPattern.matcher(value).replaceAll("");  
  82.             // Avoid vbscript:... e­xpressions  
  83.             scriptPattern = Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE);  
  84.             value = scriptPattern.matcher(value).replaceAll("");  
  85.             // Avoid οnlοad= e­xpressions  
  86.             scriptPattern = Pattern.compile("onload(.*?)=",  
  87.                     Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);  
  88.             value = scriptPattern.matcher(value).replaceAll("");  
  89.   
  90.         }  
  91.         return value;  
  92.     }  
  93. }  


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值