SpringSecurity當中的CSRF防范詳解

CSRF防范

什么是CSER

以下是基于 CSRF 攻擊過程的 順序圖 及詳細解釋,結合多個技術文檔中的攻擊流程:


CSRF 攻擊順序圖

用戶 瀏覽器 受信任網站A 惡意網站B 正常操作階段 訪問網站A并登錄 發送登錄請求 返回登錄成功的Cookie 存儲Cookie(保持會話) 攻擊觸發階段 訪問惡意網站B(如點擊鏈接) 請求頁面 返回包含惡意代碼的頁面(如自動提交表單的JS) 偽造請求執行階段 自動攜帶Cookie發送惡意請求(如轉賬) 驗證Cookie合法,執行請求 用戶未感知到操作已被篡改 用戶 瀏覽器 受信任網站A 惡意網站B

攻擊過程分步解讀

  1. 用戶登錄受信任網站A
    ? 用戶通過瀏覽器正常登錄網站A(例如銀行網站),服務器生成會話 Cookie 并返回給瀏覽器。

? 關鍵點:此時瀏覽器會存儲該 Cookie,后續所有對網站A的請求都會自動攜帶此 Cookie(如 Set-Cookie: session_id=abc123)。

  1. 用戶訪問惡意網站B
    ? 攻擊者通過釣魚鏈接、誘導廣告等方式,誘使用戶訪問惡意網站B。

? 攻擊代碼示例(來自網頁3):

<!-- 惡意網站B的頁面 -->
<img src="http://網站A/轉賬?to=攻擊者&amount=1000">
<!-- 或通過JS自動提交表單 -->
<script>document.write('<form action="http://網站A/改密碼" method="POST">');document.write('<input type="hidden" name="new_password" value="hacker123">');document.write('</form>');document.forms[0].submit();
</script>
  1. 瀏覽器自動發送偽造請求
    ? 惡意網站B的代碼會觸發瀏覽器向網站A發送請求(如轉賬、修改密碼),瀏覽器會自動攜帶用戶已登錄的 Cookie。

? 服務器視角:網站A收到請求后,驗證 Cookie 合法,誤認為是用戶主動操作,執行惡意請求。

  1. 攻擊完成
    ? 用戶未感知到任何異常(如無頁面跳轉),但敏感操作已被執行(如資金轉移、密碼重置)。

攻擊成功的關鍵條件

  1. 用戶已登錄受信任網站A:攻擊依賴用戶的活躍會話。
  2. 網站A未啟用CSRF防護:如未校驗 Token、Referer 或二次驗證。
  3. 請求參數可預測:例如通過 GET 請求執行敏感操作(如 GET /轉賬?to=攻擊者)。

防御措施(引用自網頁5、網頁6)

? Token 驗證:在表單或請求頭中嵌入隨機 Token,服務端校驗 Token 合法性。

? SameSite Cookie:設置 Cookie 的 SameSite=Strict/Lax 屬性,限制跨域請求攜帶 Cookie。

? Referer 檢查:驗證請求來源是否為可信域名。


通過順序圖可以看出,CSRF 攻擊的 核心邏輯是濫用瀏覽器的 Cookie 自動攜帶機制,而防御的關鍵在于 阻斷攻擊者偽造請求的能力。

Security的CSRF簡介

根據 Spring Security 的官方設計理念及社區實踐(綜合多個技術文檔和博客),其 CSRF 防護機制的核心邏輯如下:


一、Spring Security 的 CSRF 防護機制

  1. 默認啟用的防護
    ? 自動攔截:Spring Security 從 4.0 版本起默認啟用 CSRF 保護,通過 CsrfFilter 攔截所有非安全 HTTP 方法(如 POST、PUT、DELETE)的請求。

? Token 驗證流程:

  1. 生成 Token:用戶首次訪問時,服務端生成唯一的 CSRF Token 并存儲于 HttpSessionCookie 中(默認使用 HttpSessionCsrfTokenRepository)。

  2. 客戶端攜帶 Token:在表單或 AJAX 請求中必須包含該 Token(例如通過隱藏字段或請求頭)。

  3. 服務端校驗:請求到達時,CsrfFilter 會對比客戶端提交的 Token 與服務端存儲的 Token,若不一致則拒絕請求(返回 403 錯誤)。

  4. 核心組件
    ? CsrfToken 接口:定義 Token 的生成規則,包含 token 值、參數名(_csrf)和請求頭名(X-CSRF-TOKEN)。

? CsrfTokenRepository

? HttpSessionCsrfTokenRepository(默認):Token 存儲于 Session。

? CookieCsrfTokenRepository:Token 存儲于 Cookie,適用于前后端分離場景。

? 配置示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());}
}
  1. 前端集成方式
    ? 表單頁面:通過模板引擎(如 Thymeleaf)自動注入 Token:
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

? AJAX 請求:從 Cookie 或 Meta 標簽獲取 Token 并添加到請求頭:

// 從 Cookie 獲取 Token(需配置 CookieCsrfTokenRepository)
const token = document.cookie.match(/XSRF-TOKEN=([^;]+)/)[1];
fetch('/api/data', {method: 'POST',headers: { 'X-XSRF-TOKEN': token }
});
  1. 擴展防護策略
    ? SameSite Cookie 屬性:通過設置 Cookie 的 SameSite=Strict/Lax,限制跨域請求攜帶 Cookie(需瀏覽器支持)。

? 二次驗證:對敏感操作(如轉賬)疊加驗證碼或密碼確認。


二、未啟用 CSRF 防護的危害場景

如果未啟用 CSRF 防護,攻擊者可利用以下漏洞發起攻擊:

  1. 偽造用戶操作:
    ? 自動觸發惡意請求:通過惡意頁面嵌入 <img> 或自動提交表單,誘導已登錄用戶觸發轉賬、修改密碼等操作。

    ? 示例攻擊代碼:

    <img src="http://bank.com/transfer?to=attacker&amount=10000">
    
  2. 數據篡改與泄露:
    ? 賬戶信息泄露:攻擊者篡改用戶郵箱或手機號,后續可通過“忘記密碼”功能接管賬戶。

    ? 業務邏輯繞過:例如自動關注陌生賬號、刪除用戶數據等。

  3. 企業級風險:
    ? 供應鏈攻擊:通過管理員賬戶的 CSRF 漏洞植入后門,導致企業系統被滲透。

    ? 合規風險:因數據泄露違反 GDPR 等法規,面臨高額罰款。


三、官方文檔的補充說明

雖然未直接引用 spring.io 官網,但以上機制與官方文檔一致(可通過 Spring Security 官方文檔 驗證):
? 防護原理:基于 Token 的同步器模式(Synchronizer Token Pattern)。

? 禁用場景:僅推薦在純 API 服務(無瀏覽器交互)時通過 http.csrf().disable() 關閉防護。


總結
Spring Security 通過 CSRF Token 的生成與驗證機制 有效防御跨站請求偽造攻擊。若未啟用防護,攻擊者可利用用戶已登錄的會話劫持敏感操作,導致數據泄露、資金損失等嚴重后果。開發者應結合業務場景選擇 Token 存儲方式(Session/Cookie),并確保前端正確集成 Token。

CSRF防范的必要參數

以下是標準的CSRF防護參數及其生成、使用和失效規則的總結表格,結合多個技術文檔和實踐案例:

參數名稱生成者生成時機使用時機失效條件
CSRF Token服務端用戶首次訪問受保護頁面時生成在提交表單或發起狀態變更請求(如POST/PUT/DELETE)時攜帶會話過期失效、單次使用后失效(單次有效性)、超出時間窗口(如5-10分鐘)
SameSite Cookie服務端用戶首次登錄時生成瀏覽器自動管理,用于限制跨域請求攜帶CookieCookie過期失效、瀏覽器關閉(根據SameSite策略)
二次驗證參數服務端或第三方系統用戶觸發敏感操作(如轉賬)時生成執行關鍵操作前需二次驗證(如短信驗證碼)驗證碼使用后失效、超時失效(如5分鐘)

詳細說明

  1. CSRF Token
    ? 生成者:服務端通過CsrfTokenRepository生成,例如HttpSessionCsrfTokenRepository(存儲在會話中)或CookieCsrfTokenRepository(存儲在Cookie)。

? 生成時機:用戶首次訪問需要CSRF防護的頁面時(如登錄頁、表單頁),或每次頁面加載時動態生成新Token。

? 使用時機:必須嵌入到所有非安全方法(POST/PUT/DELETE)的請求中,例如:

? 表單:通過隱藏字段<input type="hidden" name="_csrf" value="token">

? AJAX:通過請求頭X-CSRF-TOKENX-XSRF-TOKEN傳遞。

? 失效條件:

? 會話過期:若用戶會話終止,Token隨之失效。

? 單次有效性:部分系統設計Token僅限單次使用(如支付場景)。

? 時間窗口:設置Token有效期(如10分鐘),超時自動失效。

  1. SameSite Cookie
    ? 生成者:服務端在用戶登錄時生成會話Cookie,并設置SameSite屬性。

? 使用規則:

? SameSite=Strict:禁止跨域請求攜帶Cookie(適用于高敏感操作)。

? SameSite=Lax:允許安全跨域請求(如導航鏈接的GET請求)。

? 失效條件:遵循Cookie的過期策略(如會話Cookie在瀏覽器關閉后失效)。

  1. 二次驗證參數
    ? 生成者:服務端在用戶觸發敏感操作時生成(如短信驗證碼、動態口令)。

? 使用時機:關鍵操作(如修改密碼、大額轉賬)前需用戶二次確認。

? 失效條件:驗證碼使用后立即失效,或設計為短時間有效(如5分鐘)。


引用來源
? CSRF Token生成與驗證邏輯:

? SameSite Cookie機制:

? 二次驗證參數設計:

通過上述參數組合(如Token+SameSite+二次驗證),可構建多層防御體系,有效阻斷CSRF攻擊。

Security是怎么防范的

Spring Security 通過 CSRF Token 驗證機制 和 防御策略組合 來避免 CSRF 攻擊,以下是其核心實現邏輯及關鍵步驟:


一、CSRF Token 驗證機制

  1. 生成與存儲 Token
    ? Token 生成:當用戶首次訪問受保護頁面時,Spring Security 會自動生成一個唯一的隨機 CSRF Token。

? 默認使用 HttpSessionCsrfTokenRepository,將 Token 存儲在用戶會話(HttpSession)中。

? 若為前后端分離架構,可使用 CookieCsrfTokenRepository 將 Token 存儲于 Cookie 中,并允許前端通過 JavaScript 讀取。

? Token 結構:包含三個核心屬性:token(隨機值)、parameterName(參數名,默認為 _csrf)、headerName(請求頭名,默認為 X-CSRF-TOKEN)。

  1. 客戶端攜帶 Token
    ? 表單提交:

在 HTML 表單中通過隱藏字段嵌入 Token。例如使用 Thymeleaf 模板引擎自動注入:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

? AJAX 請求:

通過請求頭傳遞 Token。前端需從 Cookie 或 Meta 標簽中獲取 Token,并添加到請求頭中:

// 從 Cookie 獲取 Token(需配置 CookieCsrfTokenRepository)
const token = document.cookie.match(/XSRF-TOKEN=([^;]+)/)[1];
fetch('/api/data', {method: 'POST',headers: { 'X-XSRF-TOKEN': token }
});
  1. 服務端驗證 Token
    ? 攔截與校驗:

CsrfFilter 會攔截所有非安全 HTTP 方法(如 POST、PUT、DELETE),從請求中提取 Token,并與服務端存儲的 Token 對比。
? 若 Token 匹配,請求通過。

? 若 Token 缺失或不匹配,返回 403 Forbidden 錯誤。


二、防御策略擴展

  1. SameSite Cookie 屬性
    ? 通過設置 Cookie 的 SameSite 屬性限制跨域請求攜帶 Cookie:

? SameSite=Strict:僅允許同站點請求攜帶 Cookie。

? SameSite=Lax:允許部分安全跨站點請求(如導航鏈接)。

? 配置示例:

@Bean
public CsrfTokenRepository csrfTokenRepository() {CookieCsrfTokenRepository repository = new CookieCsrfTokenRepository();repository.setSameSite("Lax");return repository;
}
  1. 雙重驗證(Double Submit Cookie)
    ? 服務端將 Token 同時存儲在 Cookie 和表單/請求頭中,驗證時需兩者一致。

? 適用于分布式系統,避免依賴會話存儲。

  1. 安全方法限制
    ? 默認僅對 POST、PUT、DELETE、PATCH 等狀態修改類請求啟用 CSRF 驗證,而 GET、HEAD、OPTIONS 等安全方法無需驗證。

三、配置與最佳實踐

  1. 啟用與禁用
    ? 默認啟用:Spring Security 4.0+ 默認開啟 CSRF 防護。

? 手動關閉(不推薦):

http.csrf().disable();
  1. 前后端分離配置
    ? 后端配置 Cookie 存儲 Token:
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

? 前端從 Cookie 讀取 Token 并添加到請求頭。

  1. 最佳實踐
    ? 始終啟用 CSRF 防護:除非服務為純 API 且無瀏覽器交互。

? 結合 HTTPS:防止 Token 被中間人竊取。

? 定期更新依賴:修復已知漏洞。


四、總結

Spring Security 通過 CSRF Token 的生成、傳遞與驗證機制,結合 SameSite Cookie 和 雙重驗證 等策略,有效阻斷攻擊者偽造請求的能力。其設計兼顧靈活性與安全性,開發者需根據架構(如傳統 MVC 或前后端分離)選擇合適的 Token 存儲方式,并遵循最佳實踐以確保全面防護。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83106.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

給 DBGridEh 增加勾選用的檢查框 CheckBox

需求 Delphi 的 DBGrid 通過 DataSource 綁定到一個 DataSet 顯示數據表里面的 N 多條記錄。如果我想給每條記錄加一個 CheckBox 讓用戶去勾選&#xff0c;該怎么做&#xff1f; 以下描述&#xff0c;使用的 DBGrid 是 DBGrieEh。 Delphi 自帶的 DBGrid 要加 CheckBox 比較麻…

WordPress 和 GPL – 您需要了解的一切

如果您使用 WordPress&#xff0c;GPL 對您來說應該很重要&#xff0c;您也應該了解它。查看有關 WordPress 和 GPL 的最全面指南。 您可能聽說過 GPL&#xff08;通常被稱為 WordPress 的權利法案&#xff09;&#xff0c;但很可能并不完全了解它。這是有道理的–這是一個復雜…

力扣144題:二叉樹的前序遍歷(遞歸)

小學生一枚&#xff0c;自學信奧中&#xff0c;沒參加培訓機構&#xff0c;所以命名不規范、代碼不優美是在所難免的&#xff0c;歡迎指正。 標簽&#xff1a; 二叉樹、前序遍歷、遞歸 語言&#xff1a; C 題目&#xff1a; 給你二叉樹的根節點root&#xff0c;返回它節點值…

python:一個代理流量監控的媒體文件下載腳本

前言 一個mitmproxy代理服務應用&#xff0c;作用是監聽系統流量&#xff0c;并自動下載可能的video媒體文件到本地。 如果你沒有安裝mitmproxy或沒有做完準備工作&#xff0c;請參考我的這篇文章&#xff1a; python&#xff1a;mitmproxy代理服務搭建-CSDN博客 文件架構目錄…

SAP Business One(B1)打開自定義對象報錯【Failed to initialize document numbering:】

業務場景&#xff1a; 新版本的客戶端&#xff0c;打開已經注冊的自定義單據類型的表的時候&#xff0c;報錯【Failed to initialize document numbering:】。 但是注冊的自定義主數據類型的表&#xff0c;不會有問題。 解決方案&#xff1a; 打開【管理-系統初始化-常規設置…

計算機網絡:WiFi路由器發射的電磁波在空氣中的狀態是什么樣的?

WiFi路由器發射的電磁波是高頻無線電波,屬于微波頻段(2.4GHz或5GHz),在空氣中以光速傳播(約310?米/秒),其傳播狀態和特性可通過以下維度詳細解析: 一、電磁波的物理特性 頻率與波長 2.4GHz頻段:波長約12.5厘米,穿透力較強但易受干擾(微波爐、藍牙等共用頻段)。5GH…

騰訊云-人臉核身+人臉識別教程

一。產品概述 慧眼人臉核身特惠活動 騰訊云慧眼人臉核身是一組對用戶身份信息真實性進行驗證審核的服務套件&#xff0c;提供人臉核身、身份信息核驗、銀行卡要素核驗和運營商類要素核驗等各類實名信息認證能力&#xff0c;以解決行業內大量對用戶身份信息真實性核實的需求&a…

tocmat 啟動怎么設置 jvm和gc

在生產環境中部署 Java Web 應用時&#xff0c;我們經常需要給 Tomcat 設置 JVM 參數和 GC 策略&#xff0c;以提高性能、穩定性和可觀察性。以下是完整教程&#xff1a; 一、Tomcat 設置 JVM 啟動參數的方式 1. 修改 startup 腳本&#xff08;推薦&#xff09; 以 Linux 系統…

zuoyyyeee

實驗拓撲圖 需求分析 1.分配接口ip 2.使用OSPF協議使三臺路由器可達 3.在路由器1&#xff0c;2 /4&#xff0c;5 使用直連接口直接配置EBGP ip配置&#xff1a; [R1]: bgp 100 rid 1.1.1.1 peer 12.0.0.2 as-number 200 network 1.1.1.1 32 [R2]: bgp 200 rid 2.2.2.2 p…

?Element UI 雙擊事件(@cell-dblclick 與 @row-dblclick)

?Element UI 雙擊事件&#xff08;cell-dblclick 與 row-dblclick&#xff09; 一、核心雙擊事件綁定? 表格單元格雙擊? ?事件綁定?&#xff1a; 通過 cell-dblclick 監聽單元格雙擊&#xff0c;接收四個參數&#xff08;row, column, cell, event&#xff09;。 ?示…

Python爬蟲實戰:研究decrypt()方法解密

1. 引言 1.1 研究背景與意義 在當今數字化時代,網絡數據蘊含著巨大的價值。然而,許多網站為了保護其數據安全和商業利益,會采用各種加密手段對傳輸的數據進行處理。這些加密措施給數據采集工作帶來了巨大挑戰。網絡爬蟲逆向解密技術應運而生,它通過分析和破解網站的加密機…

day014-服務管理

文章目錄 1. 提問的方式1.1 注意事項1.2 start法則-提問/面試 2. systemctl 系統服務管理2.1 開啟和自啟動服務sshd2.2 關閉和永久禁用防火墻2.3 查看服務的狀態2.4 重啟服務2.5 sshd重啟失敗案例 3. localectl 字符集管理3.1 臨時修改語言3.2 永久修改語言3.3 用腳本修改語言 …

【redis】CacheAside的數據不一致性問題

緩存的合理使用確提升了系統的吞吐量和穩定性&#xff0c;然而這是有代價的&#xff0c;這個代價便是緩存和數據庫的一致性帶來了挑戰。 新增數據時&#xff0c;數據直接寫入數據庫&#xff0c;緩存中不存在對應記錄。首次查詢請求會觸發緩存回填&#xff0c;即從數據庫讀取新…

DA14585墨水屏學習

一、do_min_word void do_min_work(void) {timer_used_min app_easy_timer(APP_PERIPHERAL_CTRL_TIMER_DELAY_MINUTES, do_min_work);current_unix_time time_offset;time_offset 60;// if (isconnected 1)// {// GPIO_SetActive(GPIO_LED_PORT, GPIO_LED_PIN);// …

微服務調試問題總結

本地環境調試。 啟動本地微服務&#xff0c;使用公共nacos配置。利用如apifox進行本地代碼調試解決調試問題。除必要的業務微服務依賴包需要下載到本地。使用mvn clean install -DskipTests進行安裝啟動前選擇好profile環境進行啟動&#xff0c;啟動前記得mvn clean清理項目。…

C#學習第22天:網絡編程

網絡編程的核心概念 1. 套接字&#xff08;Sockets&#xff09; 定義&#xff1a;套接字是網絡通信的基本單元&#xff0c;提供了在網絡中進行數據交換的端點。用途&#xff1a;用于TCP/UDP網絡通信&#xff0c;支持低級別的網絡數據傳輸。 2.協議 TCP&#xff08;Transmiss…

TWASandGWAS中GBS filtering and GWAS(1)

F:\文章代碼\TWASandGWAS\GBS filtering and GWAS README.TXT 請檢查幻燈片“Vitamaize_update_Gorelab_Ames_GBS_filtering_20191122.pptx”中關于阿姆斯&#xff08;Ames&#xff09;ID處理流程的詳細信息。 文件夾“Ames_ID_processing”包含了用于處理阿姆斯ID的文件和R…

圖像處理篇---opencv實現坐姿檢測

文章目錄 前言一、方法概述使用OpenCV和MediaPipe關鍵點檢測角度計算姿態評估 二、完整代碼實現三、代碼說明PostureDetector類find_pose()get_landmarks()cakculate_angle()evaluate_posture() 坐姿評估標準&#xff08;可進行參數調整&#xff09;&#xff1a;可視化功能&…

.Net HttpClient 使用代理功能

HttpClient 使用代理功能 實際開發中&#xff0c;HttpClient 通過代理訪問目標服務器是常見的需求。 本文將全面介紹如何在 .NET 中配置 HttpClient 使用代理&#xff08;Proxy&#xff09;功能&#xff0c;包括基礎使用方式、代碼示例、以及與依賴注入結合的最佳實踐。 注意…

【學習路線】 游戲客戶端開發入門到進階

目錄 游戲客戶端開發入門到進階&#xff1a;系統學習路線與推薦書單一、學習總原則&#xff1a;從底層出發&#xff0c;項目驅動&#xff0c;持續迭代二、推薦學習路線圖&#xff08;初學者→進階&#xff09;第一階段&#xff1a;語言基礎與編程思維第二階段&#xff1a;游戲開…