Web系統csrf漏洞攻防

前言

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>

本文過濾器是基於比較傳統的老項目,內部具體過濾邏輯請根據自己實際項目情況變更。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章