javascript
SpringSecurity之CSRF漏洞保护
1.csrf簡介
CSRF(Cross-Site Request Forgery跨站請求偽造),也可稱為一鍵式攻擊(one-click-attack),通??s寫為CSRF或者XSRF
CSRF攻擊是一種挾持用戶在當前已登錄的瀏覽器上發送惡意請求的攻擊方法。相對于XSS利用用戶對指定網站的信任,CSRF則是利用網站對用戶網頁瀏覽器的信任。簡單來說,SCRF是攻擊者通過一些技術手段欺騙用戶的瀏覽器,去訪問一個用戶曾經認證過的網站并執行惡意請求,例如發送郵件、發消息、甚至財產操作(如轉賬和購買商品)。由于客戶端(瀏覽器)已經在該網站上認證過,所以該網站會認為是真正用戶在操作而執行請求(實際上這個并非用戶的本意)。
例子:
假設zkt現在登錄了某銀行的網站準備完成一項轉賬操作,轉賬的鏈接如下:
https://bank.xxx.com/withdrwa?account=zkt&amount=1000for=zhangsan
可以看到,這個連接是想從zkt這個賬戶下轉賬1000元到張三賬戶下,假設zkt沒有注銷登錄該銀行的網站,就在同一個瀏覽器新的選項卡中打開了一個危險網站,這個危險網站中有一幅圖片,代碼如下:
一旦用戶打開了這個網站,這個圖片鏈接中的請求就會被發送出去。由于是同一個瀏覽器并且用戶尚未注銷登錄,所以該請求會自動攜帶上對應的有效的cookie信息,進而完成一次轉賬操作。這就是跨站請求偽造。
2.csrf防御
CSRF攻擊的根源在于瀏覽器默認的身份驗證機制(自動攜帶當前網站的Cookie信息),這種機制雖然可以保證請求是來自用戶的某個瀏覽器,但是無法確保這請求是用戶授權發送。攻擊者和用戶發送的請求一模一樣,這意味著我們沒有辦法去直接拒絕這里的某一個請求。如果能在合法請求中額外攜帶一個攻擊者無法獲取的參數,就可以成功區分出兩種不同的請求,進而直接拒絕掉惡意請求。在SpringSecurity中就提供了這種機制來防御CSRF攻擊,這種機制我們稱之為令牌同步模式。
3.令牌同步模式
這是目前主流的CSRF攻擊防御方案。具體的操作方式就是在每一個HTTP請求中,除了默認自動攜帶的Cookie參數之外,再提供一個安全的、隨機生成的字符串,我們稱之為CSRF令牌。這個CSRF令牌由服務端生成,生成后再HttpSession中保存一份。當前端請求到達后,將請求攜帶的CSRF令牌信息和服務端中保存的令牌進行對比,如果兩者不相等,則拒絕掉該HTTP請求。
注意:考慮到會有一些外部站點鏈接到我們的網站,所以我們要求請求是冪等的,這樣對于HEAD、OPTIONS、TRACE等方法就沒有必要使用CSRF令牌了,強行使用可能會導致令牌泄露。4.開啟CSRF防御
@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeHttpRequests().anyRequest().authenticated().and().formLogin().and().csrf(); //開啟csrf}5.傳統Web開發使用CSRF防御
開啟CSRF防御后會自動在提交的表單中加入如下代碼,如果不能自動加入,需要在開啟之后手動加入如下代碼,并隨著請求提交。獲取服務端令牌方式如下:
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>6.前后端分離使用CSRF防御
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {//...@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeHttpRequests().anyRequest().authenticated().and().formLogin().and().csrf()//開啟csrf // .disable();.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); //將令牌保存到cookie中 允許cookie前端獲取http.addFilterAt(loginFilter(), UsernamePasswordAuthenticationFilter.class);} }訪問登錄界面查看cookie
發送請求攜帶令牌即可
- 請求參數中攜帶令牌
- 請求頭中攜帶令牌
總結
以上是生活随笔為你收集整理的SpringSecurity之CSRF漏洞保护的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字信号处理——DDS模块设计(3)
- 下一篇: 语音控制Office