Filter安全過濾高級最終行(XSS攻擊)

package com.what21.filter.xss;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

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 XSSFilter implements Filter {

// XSS處理Map
private static Map<String,String> xssMap = new LinkedHashMap<String,String>();
 
public void init(FilterConfig filterConfig) throws ServletException {
    // 含有腳本: script
    xssMap.put("[s|S][c|C][r|R][i|C][p|P][t|T]", "");
    // 含有腳本 javascript
    xssMap.put("[\\\"\\\'][\\s]*[j|J][a|A][v|V][a|A][s|S][c|C][r|R][i|I][p|P][t|T]:(.*)[\\\"\\\']", "\"\"");
    // 含有函數: eval
    xssMap.put("[e|E][v|V][a|A][l|L]\\((.*)\\)", "");
    // 含有符號 <
    xssMap.put("<", "&lt;");
    // 含有符號 >
    xssMap.put(">", "&gt;");
    // 含有符號 (
    xssMap.put("\\(", "(");
    // 含有符號 )
    xssMap.put("\\)", ")");
    // 含有符號 '
    xssMap.put("'", "'");
    // 含有符號 "
    xssMap.put("\"", "\"");
}
 
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    // 強制類型轉換 HttpServletRequest
    HttpServletRequest httpReq = (HttpServletRequest)request;
    // 構造HttpRequestWrapper對象處理XSS
    HttpRequestWrapper httpReqWarp = new HttpRequestWrapper(httpReq,xssMap);
    // 
    chain.doFilter(httpReqWarp, response);

}

public void destroy() {
     
}

}

=============================
package com.what21.filter.xss;

import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public final class HttpRequestWrapper extends HttpServletRequestWrapper {

private Map<String, String> xssMap;
 
public HttpRequestWrapper(HttpServletRequest request) {
    super(request);
}

public HttpRequestWrapper(HttpServletRequest request,
        Map<String, String> xssMap) {
    super(request);
    this.xssMap = xssMap;
}

@Override
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;
}

@Override
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);

}

/**
* 清除惡意的XSS腳本
*
* @param value
* @return
*/
private String cleanXSS(String value) {
Set<String> keySet = xssMap.keySet();
for(String key : keySet){
String v = xssMap.get(key);
value = value.replaceAll(key,v);
}
return value;
}
}

=============================================================================
<filter>
<filter-name>XSSFilter</filter-name>
<filter-class>com.what21.filter.xss.XSSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 3,918評論 2 8
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,738評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • 本文包括:1、Filter簡介2、Filter是如何實現攔截的?3、Filter開發入門4、Filter的生命周期...
    廖少少閱讀 7,310評論 3 56
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,832評論 0 11