您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何分析Spring對CSRF的防范,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
跨站請求偽造。經典場景是:
實際上利用有 XSS 漏洞,完全可以無需受害者參與利用 javascript 而自動觸發第 4 第 5 步。
這里我們把瀏覽器等同于用戶,有些數據是用戶自己可見的,有些數據是瀏覽器自動處理、發送而用戶對這些數據是無感知的(比如 SessionId)。
銀行網站以 cookie 的形式把 sessionId 發送給瀏覽器(set-cookie),瀏覽器每次請求都會再自動帶上 cookie(cookie)。
上面場景第 5 步雖然“壞”表單不是源于銀行網站頁面而是在第三方網站的頁面上,但是瀏覽器發現目標地址是銀行網站,因此會自動帶上相應的 cookie,比如 JSESSION 就會隨帶著被發送了。從服務器的角度看,來自第 4 步的數據與正常數據沒有任何差別,因為這個業務請求便會被執行。
歸根結底,這種 CSRF 的問題是因為早期的cookie設計過于簡單,沒有和現代瀏覽器同源策略等安全機制同步造成的。
一個是主流的“Synchronizer Token Pattern”方法,另一個是漸成主流的“SameSite Attribute”。
1)SameSite Attribute
這個方式實施和理解比較容易,我們先說。
服務端利用 cookie 的 SameSite 屬性可以禁止瀏覽器從外部站點發送請求時帶上 cookie。比如下面的 cookie 就不會被放在由在第三方網頁發起而目標是銀行網站的請求上。這就自然解決了上面的 CSRF 的問題。SameSite還可設為Strict。
Set-Cookie: JSESSIONID=randomid; Domain=bank.example.com; Secure; HttpOnly; SameSite=Lax
2)Synchronizer Token Pattern
這個解決辦法的原理是對來自瀏覽器的請求我們都回送一個隨機數,下次瀏覽器再請求業務時需要在 header 里或者表單里帶上這個隨機數。這個隨機數就是 csrf token。Spring Security就是采用的這個方式。
這個辦法之所以能防范 CSRF,是因為 sessionId 來自 cookie,而 csrf token 來自 header 或者 form。相當于分別在兩條不同的路徑上傳遞。
Spring Security 模塊生成 csrf token 后可放在兩個地方。Spring 默認的,隨機數與 sessionId 關聯,放在 session 里。另一個方式:隨機數放在 cookie 里。
與 session 關聯比較容易理解,下次瀏覽器發送請求過來,服務端就可以從 header 或 form 里取出來的 csrf token 與 session 中的隨機數相比較來進行判斷。
通過 cookie 保存 csrf 是怎么回事呢?如果 csrf token 通過 cookie 發送給瀏覽器,那這個隨機數不就跟 JSESSIONID 一樣了會被瀏覽器自動傳回到服務器了嗎?
是的,這個通過cookie傳給瀏覽器的 csrf token 一定會被瀏覽器傳回給服務器,我們也正是利用這一點“保存”了 csrf token。之所以使用基于 cookie 的方式,是因為要針對前后端分離的情形讓前端可以使用 javascript 獲得 csrf token,并把這個 token 作為下次請求的 header 參數或者 form 參數傳遞給服務端。服務端所要做的就是通過對比來自 cookie 和 header/form 這兩條路徑的 csrf token 來做出該請求是否為CSRF的判斷。
下面代碼設置使用 cookie 保存csrf token,使用 cookie 傳遞 token 需要把 cookie 的 HttpOnly 屬性設置為 false,以便讓 javascript 能讀到此值。
@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) {
http
.csrf(csrf -> csrf
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
);
}
}
關于如何分析Spring對CSRF的防范就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。