前言
csrf 漏洞是配合xss漏洞對web系統進行滲透攻擊的,或者是攻擊者構造一個惡意的請求,例如 http://www.test.com/help.html 如果目標 web 系統存在 csrf 漏洞,並且系統管理員已經登錄,那麼攻擊者可以誘騙管理員點擊 http://www.test.com/help.html 這個鏈接,這時候攻擊方相當於盜用了管理員的身份來進行操作,而且管理員絲毫未察覺,這個攻擊就已經完成了,風險可想而知。
解決方案
可以對指向服務器的請求的請求頭中的referer進行校驗,判斷當前erferer是否是來自本網站,如果不是則定爲非法訪問,直接拒絕,具體做法是寫一個全局過濾器,廢話不多說,直接上代碼:
過濾器 RefererFilter:
package com.common.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;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
/**
* @ClassName: RefererFilter
* @Description: 過濾非本站請求, 防止csrf跨站請求僞造進行攻擊
* @author weny.yang
*/
public class RefererFilter implements Filter {
private static final Logger logger = LogManager.getLogger(RefererFilter.class);
public void init(FilterConfig filterconfig1) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//請求url
String url = request.getServletPath();
//請求來源標識
String referer = request.getHeader("referer");
String webPath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
//攔截所有不是來自本網站的非靜態資源請求
if(url.contains("/servlet/") && (null==referer || (null!=referer && !referer.contains(webPath)))) {
logger.info("非法盜鏈請求被攔截,Referer= " + referer + " 目標Url= " + url);
return;
}
chain.doFilter(request, response);
}
public void destroy() {
}
}
web.xml 配置:
<!-- 過濾非本站請求,防止csrf跨站請求僞造進行攻擊 -->
<filter>
<filter-name>RefererFilter</filter-name>
<filter-class>com.common.filter.RefererFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>RefererFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
本文過濾器是基於比較傳統的老項目,內部具體過濾邏輯請根據自己實際項目情況變更。