xss跨站攻擊防御之filter法

xss攻擊:跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁面里插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的Script代碼會被執(zhí)行,從而達到惡意攻擊用戶的特殊目的。

來看看簡單的攻擊案例:

腳本:

?nextUrl=xss%20alert%22%3C/sCript%3E%3Cscript%3E(/zheli/)%3C/script%3Ed=%22

效果圖:


腳本二:/loginView?nextUrl=%27%22%2F%3E%3C%2Fscript%3E%3Cscript%3Ealert%3Cscript%3

效果圖:

大家看到了嗎?本來一個正常的頁面經(jīng)過XSS攻擊后就不正常了。通過javascript還可以獲取到cookie信息的。所以防御是很關(guān)鍵的。

下面給大家提供一個簡單實用filter來處理的。

1:創(chuàng)建 XssHttpServletRequestWrapper 類

代碼如下:

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper? {

public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {

super(servletRequest);

}

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;

}

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

}

private String cleanXSS(String value) {

//轉(zhuǎn)義 <>符號的

value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");

//轉(zhuǎn)義 ()符號的

value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");

//轉(zhuǎn)義 '的

value = value.replaceAll("'", "& #39;");

//轉(zhuǎn)義雙引號

value = value.replaceAll("\"", " "");

//轉(zhuǎn)義/的

value = value.replaceAll("/", "& #x2f;");

//轉(zhuǎn)義雙引號

value = value.replaceAll("\"", " "");

//轉(zhuǎn)義 函數(shù)的

value = value.replaceAll("eval\\((.*)\\)", "");

//轉(zhuǎn)義 javascript的

value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");

value = value.replaceAll("script", "");

return value;

}

}


2:創(chuàng)建filter類

代碼如下:

import java.io.IOException;

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 {

FilterConfig filterConfig = null;

public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;

}

public void destroy() {

this.filterConfig = null;

}

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

chain.doFilter(new XssHttpServletRequestWrapper(

(HttpServletRequest) request), response);

}

}


3:在web.xml中配置:


重啟項目。重新訪問。頁面正常

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容