1. 程式人生 > 實用技巧 >CSRF攻擊的原理和spring security對CSRF攻擊的解決方法

CSRF攻擊的原理和spring security對CSRF攻擊的解決方法

此文轉載自: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傳送給伺服器。

菜雞寫日記!