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中配置:

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