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

對於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發送給服務器。

菜雞寫日記!

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