使用filter過濾xss攻擊
阿新 • • 發佈:2019-02-18
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程式碼- package com.sg.security;
- import java.io.IOException;
-
import java.util.Enumeration;
- import java.util.Map;
- import java.util.Set;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletRequestWrapper;
- import javax.servlet.http.HttpServletResponse;
- /**
- * @author winnie
- * @date
-
* @describe request資訊封裝類,用於判斷、處理request請求中特殊字元
- */
- publicclass XSSHttpRequestWrapper extends HttpServletRequestWrapper {
- /**
- * 封裝http請求
- * @param request
- */
- public XSSHttpRequestWrapper(HttpServletRequest request) {
- super(request);
- }
- @Override
- public String getHeader(String name) {
- String value = super.getHeader(name);
- // 若開啟特殊字元替換,對特殊字元進行替換
- if(XSSSecurityConfig.REPLACE){
- XSSSecurityManager.securityReplace(name);
- }
- return value;
- }
- @Override
- public String getParameter(String name) {
- String value = super.getParameter(name);
- // 若開啟特殊字元替換,對特殊字元進行替換
- if(XSSSecurityConfig.REPLACE){
- XSSSecurityManager.securityReplace(name);
- }
- return value;
- }
- /**
- * 沒有違規的資料,就返回false;
- *
- * @return
- */
- @SuppressWarnings("unchecked")
- privateboolean checkHeader(){
- Enumeration<String> headerParams = this.getHeaderNames();
- while(headerParams.hasMoreElements()){
- String headerName = headerParams.nextElement();
- String headerValue = this.getHeader(headerName);
- if(XSSSecurityManager.matches(headerValue)){
- returntrue;
- }
- }
- returnfalse;
- }
- /**
- * 沒有違規的資料,就返回false;
- *
- * @return
- */
- @SuppressWarnings("unchecked")
- privateboolean checkParameter(){
- Map<String,Object> submitParams = this.getParameterMap();
- Set<String> submitNames = submitParams.keySet();
- for(String submitName : submitNames){
- Object submitValues = submitParams.get(submitName);
- if(submitValues instanceof String){
- if(XSSSecurityManager.matches((String)submitValues)){
- returntrue;
- }
- }elseif(submitValues instanceof String[]){
- for(String submitValue : (String[])submitValues){
- if(XSSSecurityManager.matches((String)submitValue)){
- returntrue;
- }
- }
- }
- }
- returnfalse;
- }
- /**
- * 沒有違規的資料,就返回false;
- * 若存在違規資料,根據配置資訊判斷是否跳轉到錯誤頁面
- * @param response
- * @return
- * @throws IOException
- * @throws ServletException
- */
- publicboolean validateParameter(HttpServletResponse response) throws ServletException, IOException{
- // 開始header校驗,對header資訊進行校驗
- if(XSSSecurityConfig.IS_CHECK_HEADER){
- if(this.checkHeader()){
- returntrue;
- }
- }
- // 開始parameter校驗,對parameter資訊進行校驗
- if(XSSSecurityConfig.IS_CHECK_PARAMETER){
- if(this.checkParameter()){
- returntrue;