最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺析Spring?Security如何防止CSRF攻擊

 更新時(shí)間:2025年07月04日 10:07:24   作者:Java皇帝  
CSRF(Cross-Site?Request?Forgery)攻擊,即跨站請(qǐng)求偽造攻擊,本文主要為大家整理了Spring?Security防止CSRF攻擊的相關(guān)方法,大家可以根據(jù)需要進(jìn)行選擇

一、CSRF 攻擊簡(jiǎn)介

CSRF(Cross-Site Request Forgery)攻擊,即跨站請(qǐng)求偽造攻擊,是一種利用用戶已登錄的身份,在用戶不知情的情況下,強(qiáng)制其執(zhí)行非預(yù)期操作的攻擊方式。攻擊者通常會(huì)通過偽造的請(qǐng)求,誘使用戶在已登錄的應(yīng)用程序中執(zhí)行惡意操作,例如轉(zhuǎn)賬、修改個(gè)人信息等。

二、Spring Security 防止 CSRF 攻擊的機(jī)制

1. 默認(rèn)啟用 CSRF 保護(hù)

從 Spring Security 4.0 開始,默認(rèn)情況下會(huì)啟用 CSRF 保護(hù)。這意味著對(duì)于 PATCH、POST、PUT 和 DELETE 方法的請(qǐng)求,Spring Security 會(huì)自動(dòng)進(jìn)行 CSRF 驗(yàn)證。

2. CSRF 令牌的生成與驗(yàn)證

Spring Security 通過生成唯一的 CSRF 令牌(Token)來防止 CSRF 攻擊。具體流程如下:

  • 生成 CSRF 令牌:服務(wù)器在處理請(qǐng)求時(shí),會(huì)生成一個(gè)唯一的 CSRF 令牌,并將其存儲(chǔ)在用戶的會(huì)話(HttpSession)或 Cookie 中。
  • 客戶端提交 CSRF 令牌:客戶端在提交表單或發(fā)送 AJAX 請(qǐng)求時(shí),需要將 CSRF 令牌包含在請(qǐng)求中。通常,這個(gè)令牌會(huì)作為表單的一個(gè)隱藏字段或請(qǐng)求頭的一部分發(fā)送。
  • 服務(wù)器驗(yàn)證 CSRF 令牌:服務(wù)器在接收到請(qǐng)求后,會(huì)從請(qǐng)求中提取 CSRF 令牌,并與存儲(chǔ)在會(huì)話或 Cookie 中的令牌進(jìn)行比較。如果兩者一致,則認(rèn)為請(qǐng)求是合法的;如果不一致,則認(rèn)為是 CSRF 攻擊,服務(wù)器會(huì)拒絕該請(qǐng)求。

3. 配置與自定義

開啟或關(guān)閉 CSRF 保護(hù):可以通過配置來開啟或關(guān)閉 CSRF 保護(hù)。例如,在基于 Java 配置的項(xiàng)目中,可以通過以下代碼關(guān)閉 CSRF 保護(hù):

http.csrf().disable();

或者在基于 XML 配置的項(xiàng)目中,使用以下代碼:

<security:csrf disabled="true"/>

自定義 CSRF 令牌存儲(chǔ)方式:Spring Security 提供了 CsrfTokenRepository 接口,開發(fā)者可以實(shí)現(xiàn)該接口來自定義 CSRF 令牌的存儲(chǔ)和獲取方式。默認(rèn)實(shí)現(xiàn)是 HttpSessionCsrfTokenRepository,它將 CSRF 令牌存儲(chǔ)在 HttpSession 中。

4. 在請(qǐng)求中包含 CSRF 令牌

表單提交:在 HTML 表單中,可以通過 Thymeleaf 等模板引擎自動(dòng)包含 CSRF 令牌。例如:

<form action="/submit" method="POST">
    <input type="hidden" name="_csrf" value="${_csrf.token}" />
    <button type="submit">Submit</button>
</form>

AJAX 請(qǐng)求:在使用 AJAX 提交請(qǐng)求時(shí),需要手動(dòng)將 CSRF 令牌添加到請(qǐng)求頭中。例如,使用 jQuery 時(shí)可以這樣操作:

$.ajax({
    url: '/submit',
    type: 'POST',
    headers: {
        'X-CSRF-TOKEN': $('meta[name="_csrf"]').attr('content')
    },
    data: {
        // Your data here
    },
    success: function(response) {
        console.log(response);
    },
    error: function(xhr, status, error) {
        console.error('Error:', error);
    }
});

在 HTML 中,需要包含 CSRF 令牌的 meta 標(biāo)簽:

<meta name="_csrf" content="${_csrf.token}" />

三、最佳實(shí)踐

  • 始終啟用 CSRF 保護(hù):除非有充分的理由,否則應(yīng)始終啟用 CSRF 保護(hù),以確保應(yīng)用程序的安全性。
  • 使用 HTTPS:通過使用 HTTPS,可以防止攻擊者攔截和篡改請(qǐng)求,從而提高應(yīng)用程序的安全性。
  • 限制 CSRF 令牌的作用域:可以配置 CSRF 令牌僅對(duì)特定的端點(diǎn)有效,從而減少潛在的安全風(fēng)險(xiǎn)。
  • 定期更新依賴:及時(shí)更新 Spring Security 和其他相關(guān)依賴,以修復(fù)已知的安全漏洞。

四、方法補(bǔ)充

Spring Security 防止 CSRF 攻擊

使用 security 是 3.3.2 版本

1、 啟用 CSRF ,security 自帶功能

@Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        // 禁用默認(rèn)的登錄和退出
        httpSecurity.formLogin(AbstractHttpConfigurer::disable);
        httpSecurity.logout(AbstractHttpConfigurer::disable);
        //開啟 CSRF
        httpSecurity.csrf(csrf -> csrf
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()));
        httpSecurity.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
        // 配置攔截規(guī)則
        httpSecurity.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests
            // 放行白名單
            .requestMatchers(CollUtil.isEmpty(ignoreWhiteProperties.getWhites()) ? new String[0] :
                ignoreWhiteProperties.getWhites().toArray(new String[0])).permitAll()
            // 需要鑒權(quán)認(rèn)證
            .anyRequest().authenticated());

        // 添加過濾器
        httpSecurity.addFilterBefore(authTokenFilter(), UsernamePasswordAuthenticationFilter.class);

        // 異常時(shí)認(rèn)證處理流程
        httpSecurity.exceptionHandling(
            exceptionHandlingConfigurer -> exceptionHandlingConfigurer.authenticationEntryPoint(
                authenticationEntryPoint()).accessDeniedHandler(accessDeniedHandler()));
        return httpSecurity.build();
    }

2、 spring gateway  中添加過濾器先進(jìn)行添加36位 空字符,再進(jìn)行 base64 編碼,重新寫入請(qǐng)求頭中

package com.changan.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * CSRF 在頭信息中額外生成36個(gè)空字符,使其校驗(yàn)通過
 */
@Component
public class CsrfGlobalFilter implements GlobalFilter {

    private final StringBuffer preHead = new StringBuffer();

    public CsrfGlobalFilter(){
        // 生成36位隨機(jī)數(shù)
        preHead.append("\u0000".repeat(36));
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //獲取前端傳遞的 X-Xsrf-Token 頭信息
        String headerValue = exchange.getRequest().getHeaders().getFirst("X-Xsrf-Token");
        //在 X-Xsrf-Token 頭信息之前添加 36 位空字符
        headerValue = preHead + headerValue;
        //base64 加密
        String encodedValue = Base64.getEncoder().encodeToString(headerValue.getBytes(StandardCharsets.UTF_8));

        exchange.getRequest().mutate()
                .header("X-Xsrf-Token", encodedValue)
                .build();

        return chain.filter(exchange);
    }

}

總結(jié):

Security 自帶 CSRF 功能,他會(huì)在第一次 POST 請(qǐng)求后會(huì)在 cookie 中存儲(chǔ)一個(gè) csrf_token 值,前端有的框架會(huì)自動(dòng)識(shí)別,下次請(qǐng)求會(huì)自動(dòng)攜帶上,就可以防止 CSRF 攻擊

注意:

按常理是這樣的,可是 3.3.2 版本跟進(jìn)源碼發(fā)現(xiàn),需要有一個(gè) 36 位 前綴隨機(jī)數(shù),但是后續(xù)需要異或運(yùn)算= csrf_token 本身才放行。這里應(yīng)該是要通過計(jì)算得出。

上述為了能實(shí)現(xiàn)功能,暫時(shí)直接用 “空字符” 也能成功

五、總結(jié)

Spring Security 提供了強(qiáng)大的 CSRF 防護(hù)機(jī)制,通過生成和驗(yàn)證 CSRF 令牌,有效防止了 CSRF 攻擊。開發(fā)者可以通過配置和自定義來滿足不同的安全需求,同時(shí)遵循最佳實(shí)踐,確保應(yīng)用程序的安全性。

到此這篇關(guān)于淺析Spring Security如何防止CSRF攻擊的文章就介紹到這了,更多相關(guān)Spring Security防CSRF攻擊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中的FileInputStream三種read()函數(shù)用法

    java中的FileInputStream三種read()函數(shù)用法

    這篇文章主要介紹了java中的FileInputStream三種read()函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 關(guān)于Idea中的.properties文件顯示問題

    關(guān)于Idea中的.properties文件顯示問題

    這篇文章主要介紹了關(guān)于Idea中的.properties文件顯示問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • 深入講解RocketMQ原理

    深入講解RocketMQ原理

    這篇文章主要介紹了詳解SpringBoot整合RocketMQ,RocketMQ作為一款純java、分布式、隊(duì)列模型的開源消息中間件,支持事務(wù)消息、順序消息、批量消息、定時(shí)消息、消息回溯等,需要的朋友可以參考下
    2023-07-07
  • SpringBoot整合WebSocket的客戶端和服務(wù)端的實(shí)現(xiàn)代碼

    SpringBoot整合WebSocket的客戶端和服務(wù)端的實(shí)現(xiàn)代碼

    這篇文章主要介紹了SpringBoot整合WebSocket的客戶端和服務(wù)端的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • JavaSE之File類用法(遞歸查找文件)

    JavaSE之File類用法(遞歸查找文件)

    這篇文章主要介紹了JavaSE之File類用法(遞歸查找文件),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • SpringBoot+JWT實(shí)現(xiàn)注冊(cè)、登錄、狀態(tài)續(xù)簽流程分析

    SpringBoot+JWT實(shí)現(xiàn)注冊(cè)、登錄、狀態(tài)續(xù)簽流程分析

    這篇文章主要介紹了SpringBoot+JWT實(shí)現(xiàn)注冊(cè)、登錄、狀態(tài)續(xù)簽【登錄保持】,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • SpringMVC之@requestBody的作用及說明

    SpringMVC之@requestBody的作用及說明

    這篇文章主要介紹了SpringMVC之@requestBody的作用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 淺談Spring Boot: 接口壓測(cè)及簡(jiǎn)要優(yōu)化策略

    淺談Spring Boot: 接口壓測(cè)及簡(jiǎn)要優(yōu)化策略

    這篇文章主要介紹了淺談Spring Boot: 接口壓測(cè)及簡(jiǎn)要優(yōu)化策略,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • java?實(shí)現(xiàn)獲取指定位置后的第一個(gè)數(shù)字

    java?實(shí)現(xiàn)獲取指定位置后的第一個(gè)數(shù)字

    這篇文章主要介紹了java?實(shí)現(xiàn)獲取指定位置后的第一個(gè)數(shù)字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java實(shí)現(xiàn)的猜數(shù)字游戲示例

    Java實(shí)現(xiàn)的猜數(shù)字游戲示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的猜數(shù)字游戲,涉及Java數(shù)學(xué)運(yùn)算與判斷相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06

最新評(píng)論

汕尾市| 渑池县| 乡宁县| 灌阳县| 雅江县| 阿合奇县| 温宿县| 永平县| 霸州市| 原阳县| 西平县| 周口市| 瑞金市| 政和县| 永济市| 密云县| 交城县| 合作市| 加查县| 峨边| 华坪县| 慈利县| 依安县| 聂拉木县| 滦南县| 加查县| 鹤岗市| 华蓥市| 星子县| 恩施市| 商都县| 新和县| 青州市| 云和县| 阿图什市| 宜川县| 涟水县| 沧州市| 仪陇县| 卢湾区| 车险|