1. 程式人生 > >使用filter過濾xss攻擊

使用filter過濾xss攻擊

 http://winnie825.iteye.com/blog/1170833

先說一下實現思路:

1. 使用正則表示式的方式實現指令碼過濾,這個方法準確率較高,但是可能根據不能的要求會變動;

2. 為了保證配置靈活(包括正則表示式靈活),使用xml配置檔案的方式記錄配置資訊,配置資訊包含是否開啟校驗、是否記錄日誌、是否中斷請求、是否替換指令碼字元等;

3. 為保證xml與正則表示式的特殊字元不衝突,使用<![CDATA[]]>標籤存放正則表示式,但是在類中需要特殊處理;

4. 通過繼承HttpRequestWrapper的方式實現request中header和parameter資訊過濾;

5. xml解析使用dom4j,稍後會對這個工具的使用寫一篇文章,暫時辛苦大家去網站查詢資料(這篇文章很不錯http://www.ibm.com/developerworks/cn/xml/x-dom4j.html);

6. 使用XSSSecurityManager類實現配置資訊載入和處理,XSSSecurityConfig記錄匹配資訊,XSSSecurityCon標識程式所需常量;

功能實現流程

Java程式碼  收藏程式碼
  1. package com.sg.security;  
  2. import java.io.IOException;  
  3. import java.util.Enumeration;  
  4. import java.util.Map;  
  5. import java.util.Set;  
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletRequestWrapper;  
  9. import javax.servlet.http.HttpServletResponse;  
  10. /** 
  11.  * @author winnie 
  12.  * @date  
  13.  * @describe request資訊封裝類,用於判斷、處理request請求中特殊字元
     
  14.  */
  15. publicclass XSSHttpRequestWrapper extends HttpServletRequestWrapper {  
  16.     /** 
  17.      * 封裝http請求 
  18.      * @param request 
  19.      */
  20.     public XSSHttpRequestWrapper(HttpServletRequest request) {  
  21.         super(request);  
  22.     }  
  23.     @Override
  24.     public String getHeader(String name) {  
  25.         String value = super.getHeader(name);  
  26.         // 若開啟特殊字元替換,對特殊字元進行替換
  27.         if(XSSSecurityConfig.REPLACE){  
  28.             XSSSecurityManager.securityReplace(name);  
  29.         }  
  30.         return value;  
  31.     }  
  32.     @Override
  33.     public String getParameter(String name) {  
  34.         String value = super.getParameter(name);  
  35.         // 若開啟特殊字元替換,對特殊字元進行替換
  36.         if(XSSSecurityConfig.REPLACE){  
  37.             XSSSecurityManager.securityReplace(name);  
  38.         }  
  39.         return value;  
  40.     }  
  41.     /** 
  42.      * 沒有違規的資料,就返回false; 
  43.      *  
  44.      * @return 
  45.      */
  46.     @SuppressWarnings("unchecked")  
  47.     privateboolean checkHeader(){  
  48.         Enumeration<String> headerParams = this.getHeaderNames();  
  49.         while(headerParams.hasMoreElements()){  
  50.             String headerName = headerParams.nextElement();  
  51.             String headerValue = this.getHeader(headerName);  
  52.             if(XSSSecurityManager.matches(headerValue)){  
  53.                 returntrue;  
  54.             }  
  55.         }  
  56.         returnfalse;  
  57.     }  
  58.     /** 
  59.      * 沒有違規的資料,就返回false; 
  60.      *  
  61.      * @return 
  62.      */
  63.     @SuppressWarnings("unchecked")  
  64.     privateboolean checkParameter(){  
  65.         Map<String,Object> submitParams = this.getParameterMap();  
  66.         Set<String> submitNames = submitParams.keySet();  
  67.         for(String submitName : submitNames){  
  68.             Object submitValues = submitParams.get(submitName);  
  69.             if(submitValues instanceof String){  
  70.                 if(XSSSecurityManager.matches((String)submitValues)){  
  71.                     returntrue;  
  72.                 }  
  73.             }elseif(submitValues instanceof String[]){  
  74.                 for(String submitValue : (String[])submitValues){  
  75.                     if(XSSSecurityManager.matches((String)submitValue)){  
  76.                         returntrue;  
  77.                     }  
  78.                 }  
  79.             }  
  80.         }  
  81.         returnfalse;  
  82.     }  
  83.     /** 
  84.      * 沒有違規的資料,就返回false; 
  85.      * 若存在違規資料,根據配置資訊判斷是否跳轉到錯誤頁面 
  86.      * @param response 
  87.      * @return 
  88.      * @throws IOException  
  89.      * @throws ServletException  
  90.      */
  91.     publicboolean validateParameter(HttpServletResponse response) throws ServletException, IOException{  
  92.         // 開始header校驗,對header資訊進行校驗
  93.         if(XSSSecurityConfig.IS_CHECK_HEADER){  
  94.             if(this.checkHeader()){  
  95.                 returntrue;  
  96.             }  
  97.         }  
  98.         // 開始parameter校驗,對parameter資訊進行校驗
  99.         if(XSSSecurityConfig.IS_CHECK_PARAMETER){  
  100.             if(this.checkParameter()){  
  101.                 returntrue;