- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- SpringSecurity框架下如何實(shí)現CSRF跨站攻擊防御
這篇文章主要介紹了SpringSecurity框架下如何實(shí)現CSRF跨站攻擊防御,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著(zhù)大家一起了解一下。
一、什么是CSRF
很多朋友在學(xué)習Spring Security的時(shí)候,會(huì )將CORS(跨站資源共享)和CSRF(跨站請求偽造)弄混,以為二者是一回事。其實(shí)不是,先解釋一下:
CORS(跨站資源共享)是局部打破同源策略的限制,使在一定規則下HTTP請求可以突破瀏覽器限制,實(shí)現跨站訪(fǎng)問(wèn)。
CSRF是一種網(wǎng)絡(luò )攻擊方式,也可以說(shuō)是一種安全漏洞,這種安全漏洞在web開(kāi)發(fā)中廣泛存在。
當我們使用Spring Security的時(shí)候,這種CSRF漏洞默認的被防御掉了。但是你會(huì )發(fā)現在跨域請求的情況下,我們的POST、DELETE、PUT等HTTP請求方式失效了。所以在筆者之前的文章中,我們使用http.csrf.disable()暫時(shí)關(guān)閉掉了CSRF的防御功能,但是這樣是不安全的,那么怎么樣才是正確的做法呢?就是本文需要向大家介紹的內容。
二、CSRF的攻擊方式
通常的CSRF攻擊方式如下:
你登錄了網(wǎng)站A,攻擊者向你的網(wǎng)站A賬戶(hù)發(fā)送留言、偽造嵌入頁(yè)面,帶有危險操作鏈接。
當你在登錄狀態(tài)下點(diǎn)擊了攻擊者的連接,因此該鏈接對你網(wǎng)站A的賬戶(hù)進(jìn)行了操作。
這個(gè)操作是你在網(wǎng)站A中主動(dòng)發(fā)出的,并且也是針對網(wǎng)站A的HTTP鏈接請求,同源策略無(wú)法限制該請求。
三、如何防御CSRF攻擊
為系統中的每一個(gè)連接請求加上一個(gè)token,這個(gè)token是隨機的,服務(wù)端對該token進(jìn)行驗證。破壞者在留言或者偽造嵌入頁(yè)面的時(shí)候,無(wú)法預先判斷CSRF token的值是什么,所以當服務(wù)端校驗CSRF token的時(shí)候也就無(wú)法通過(guò)。所以這種方法在一定程度上是靠譜的。
但是如果你的電腦中毒,網(wǎng)絡(luò )信息被劫持使用token的方法仍然不安全。所以沒(méi)有絕對的安全,道高一次魔高一丈。作為開(kāi)發(fā)者,我們就做到我們應該做到的。
跳轉提示:當用戶(hù)不小心點(diǎn)擊了第三方連接,合格的應用應該提示用戶(hù)相關(guān)的風(fēng)險!由用戶(hù)自己確認是否真的要跳轉或者執行第三方連接,或者就干脆不讓非可信連接在留言區等地方存在。
四、Spring Security的CSRF token攻擊防護
首先,我們要先開(kāi)啟防護功能,在用戶(hù)登陸操作之后,生成的CSRF Token就保存在cookies中。
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf() .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) .ignoringAntMatchers("/authentication"); .and() ... }}
使用CookieCsrfTokenRepository生成CSRF Token放入cookie,并設置cookie的HttpOnly=false,允許js讀取該cookie。
使用ignoringAntMatchers開(kāi)放一些不需要進(jìn)行CSRF防護的訪(fǎng)問(wèn)路徑,比如:登錄授權。
至此,我們生成了CSRF token保存在了cookies中,瀏覽器向服務(wù)端發(fā)送的HTTP請求,都要將CSRF token帶上,服務(wù)端校驗通過(guò)才能正確的響應。這個(gè)校驗的過(guò)程并不需要我們自己寫(xiě)代碼實(shí)現,Spring Security會(huì )自動(dòng)處理。但是我們需要關(guān)注前端代碼,如何正確的攜帶CSRF token。
五、前端請求攜帶CSRF Token的方式
在thymeleaf模板中可以使用如下方式,在發(fā)送HTTP請求的時(shí)候攜帶CSRF Token。如果是前后端分離的應用,或者其他模板引擎,酌情從cookies中獲取CSRF Toekn。
5.1.在Header中攜帶CSRF token
var headers = {};headers['X-CSRF-TOKEN'] = "${_csrf.token}";$.ajax({ headers: headers, });
5.2.直接作為參數提交。
$.ajax({ data: { "_csrf": "${_csrf.token}" }});
5.3.form表單的隱藏字段
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}">
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站