此文轉載自:https://blog.csdn.net/qq_42956993/article/details/110213224#commentBox
對於CSRF攻擊的原理,直接上圖然后解釋一下
一個用戶通過瀏覽器成功登錄一個網站,登陸成功后,服務器會返回一個該用戶的唯一標識放入瀏覽器Cookie中,以此作為用戶之后操作的唯一憑證。假設此時該用戶在此網站中請求一個表單類的網頁,這時候用戶又打開了另外的一個網站,而這個網站是一個病毒網站,它直接竊取了Cookie信息,當然也包括唯一身份憑證(所以為什么說cookie不推薦保存重要信息,是有原因的),通過唯一身份憑證,病毒網站直接進行用戶所做的表單提交,而服務器是通過這個憑證來匹配用戶信息的,服務器這時候無法識別病毒網站所做的操作,誤以為是用戶操作,此時可能造成用戶嚴重損失。
Spring Security作為Spring提供的一個安全框架,使用它時,其內部便已經對CSRF攻擊做了相關的防止工作(除了異步請求)。
下面說一下Security對CSRF攻擊所作的相關工作:
繼續上圖,然后解釋:
**首先在pom.xml中導入**
<!-- security-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
當你在項目中導入了插件后,整個項目就直接被Security管理。之后我們再次登錄相關網站,爾后在網站上請求一個會返回表單類的網頁,這時候服務器不僅僅會存入一個帶唯一標識的Cookie信息,還會帶上一個類型為hidden的隱藏輸入框,里面封裝的就是security提供的另外一個隨機唯一身份標識,如圖:
這個value值是隨機生成的,而這時病毒網站可以竊取到用戶唯一標識,卻無法知道給該用戶的隨機token,這就能防止csrf攻擊所造成的影響。
但是有一些情況,security是無法做處理的,比如異步請求,這時候我們需要在代碼中做一些處理配置,才能達到相關的防止工作的要求。
下面演示security在異步請求的情況下對防止csrf攻擊的一些處理:
首先需要在觸發異步請求的前端界面上(index.html)設置以下數據:
<!--訪問該頁面時,在此處生成CSRF令牌.-->
<meta name="_csrf" th:content="${_csrf.token}">
<meta name="_csrf_header" th:content="${_csrf.headerName}">
爾后在發送異步請求的js界面設置:
發送AJAX請求之前,將CSRF令牌設置到請求的消息頭中.
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
$(document).ajaxSend(function(e, xhr, options){
xhr.setRequestHeader(header, token);
});
當刷新當前界面時,會得到token隨機標識,
之后在提交ajax請求的時候會帶着隨機生成的token發送給服務器。