Spring Boot CSRF詳解指南

一、什麼是CSRF

CSRF(Cross-site request forgery)跨站請求偽造,是黑客利用受害者已經登錄了網站的身份憑證,通過偽造請求的方式,以受害者的名義對伺服器發起非法操作請求的攻擊方式。

常見攻擊場景包括:在網站中隱藏惡意腳本,在用戶登錄網站的時候讓用戶自動執行,或者是通過誘導用戶點擊特定鏈接進行攻擊等等。

如不進行防護措施,CSRF攻擊將會導致伺服器誤認為是受害者主動發起的操作,從而對伺服器及用戶造成很高的風險。

二、為什麼需要進行CSRF防護

在Spring Security中,它內置了對CSRF(跨站點請求偽造)的保護機制。 這個保護機制建立在cookie上,它是一種偽隨機生成令牌(CSRF-Token)和伺服器端生成的令牌(Synchronizer Token)。 該令牌與session ID一起工作,用於在伺服器端驗證發出的請求是否來自該用戶。

如果我們把CSRF攻擊稱為 「帶著瀏覽器上的Cookie發起攻擊」 ,那麼我們可以對Spring Boot進行必要的CSRF防護。

三、Spring Boot中如何開啟CSRF防護

實現CSRF防護的唯一方法是發送包含正確令牌的請求。使用SPRING_SECURITY_CSRF_TOKEN的欄位是本文中一個意義重大的參數。

CSRF防護的關鍵是:在表單或AJAX請求中需要添加CSRF令牌。這要求表單以某種方式從服務獲取令牌。 Spring Security支持兩種方式:cookie方式和表單向服務請求(token方式)。

我們下面分別介紹兩種實現方式。

四、方式一:cookie方式

在Spring中,通過在CSRF令牌中添加Cookies來實現一種機制來防止CSRF攻擊。 在默認情況下, cookie方式為Spring Boot的CSRF防護機制。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
}

在過程中,只有設置appropriate CsrfTokenRepository後, Spring Security 才會自動包含一個名為_XSRF-TOKEN的cookie。當客戶端作為下一步訪問伺服器時,將從cookie和自定義的HTTP頭中提取和驗證CSRF令牌。 此外,在使用JavaScript庫jQuery或AngularJS時,需要一些額外的工作,以便在發出POST請求時自動添加名稱為X-XSRF-TOKEN的請求頭,並引用前面從cookie中獲取的值。

五、方式二:token方式

Spring Security 還支持直接將CSRF令牌放入請求(表單以及 AJAX 請求)中以進行Token方式更具體,它需要在服務端生成csrf令牌,將其放置在input hidden或者請求header中,在客戶端發送ajax請求或者表單請求時帶上csrf token,這樣伺服器校驗到伺服器csrf令牌後才允許請求訪問。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }

    @Bean
    public CsrfTokenRepository csrfTokenRepository() {
        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
        repository.setHeaderName("X-XSRF-TOKEN");
        return repository;
    }
}

前端需要獲取XSRF-TOKEN,並將其放入Http請求中。示例代碼如下:

// 獲取XSRF-TOKEN
var csrfToken = $("meta[name='_csrf']").attr("content");

$.ajax({
    type: "GET",
    url: "your-url",
    beforeSend: function (request) {
        request.setRequestHeader("X-XSRF-TOKEN", csrfToken);
    },
    data: formData,
    success: function (result) {
        //do something
    },
    error: function (error) {
        //do something
    },
});

六、綜合示例

下面是一個Spring Boot項目中完整的CSRF防護示例代碼:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll()
                .and()
            .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }

    @Bean
    public CsrfTokenRepository csrfTokenRepository() {
        HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
        repository.setHeaderName("X-XSRF-TOKEN");
        return repository;
    }
}

七、小結

CSRF攻擊具有很高的風險,因此在開發Web應用程序時,必須採取適當的安全措施來保護自己的應用程序。 在Spring Boot中,您可以使用默認的Cookie方式或在cookie和請求header中添加CSRF令牌,以增強應用程序的安全性。

原創文章,作者:ENPXK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/370392.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ENPXK的頭像ENPXK
上一篇 2025-04-22 01:14
下一篇 2025-04-22 01:14

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • 運維Python和GO應用實踐指南

    本文將從多個角度詳細闡述運維Python和GO的實際應用,包括監控、管理、自動化、部署、持續集成等方面。 一、監控 運維中的監控是保證系統穩定性的重要手段。Python和GO都有強…

    編程 2025-04-29
  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python wordcloud入門指南

    如何在Python中使用wordcloud庫生成文字雲? 一、安裝和導入wordcloud庫 在使用wordcloud前,需要保證庫已經安裝並導入: !pip install wo…

    編程 2025-04-29
  • Python字元轉列表指南

    Python是一個極為流行的腳本語言,在數據處理、數據分析、人工智慧等領域廣泛應用。在很多場景下需要將字元串轉換為列表,以便於操作和處理,本篇文章將從多個方面對Python字元轉列…

    編程 2025-04-29
  • Python小波分解入門指南

    本文將介紹Python小波分解的概念、基本原理和實現方法,幫助初學者掌握相關技能。 一、小波變換概述 小波分解是一種廣泛應用於數字信號處理和圖像處理的方法,可以將信號分解成多個具有…

    編程 2025-04-29
  • Spring Boot 集成 Jacoco

    本文將從以下幾個方面介紹如何在 Spring Boot 中集成 Jacoco:1、Jacoco 概述;2、Spring Boot 集成 Jacoco 的配置;3、生成 Jacoco…

    編程 2025-04-29
  • Python初學者指南:第一個Python程序安裝步驟

    在本篇指南中,我們將通過以下方式來詳細講解第一個Python程序安裝步驟: Python的安裝和環境配置 在命令行中編寫和運行第一個Python程序 使用IDE編寫和運行第一個Py…

    編程 2025-04-29
  • FusionMaps應用指南

    FusionMaps是一款基於JavaScript和Flash的互動式地圖可視化工具。它提供了一種簡單易用的方式,將複雜的數據可視化為地圖。本文將從基礎的配置開始講解,到如何定製和…

    編程 2025-04-29
  • Python起筆落筆全能開發指南

    Python起筆落筆是指在編寫Python代碼時的編寫習慣。一個好的起筆落筆習慣可以提高代碼的可讀性、可維護性和可擴展性,本文將從多個方面進行詳細闡述。 一、變數命名 變數命名是起…

    編程 2025-04-29

發表回復

登錄後才能評論