java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringSecurity当中的CSRF防范

SpringSecurity当中的CSRF防范使用详解

作者:堕落年代

这篇文章主要介绍了SpringSecurity当中的CSRF防范使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

CSRF防范

什么是CSER

以下是基于 CSRF 攻击过程的 顺序图 及详细解释,结合多个技术文档中的攻击流程:

CSRF 攻击顺序图

用户 浏览器 受信任网站A 恶意网站B 正常操作阶段 访问网站A并登录 发送登录请求 返回登录成功的Cookie 存储Cookie(保持会话) 攻击触发阶段 访问恶意网站B(如点击链接) 请求页面 返回包含恶意代码的页面(如自动提交表单的JS) 伪造请求执行阶段 自动携带Cookie发送恶意请求(如转账) 验证Cookie合法,执行请求 用户未感知到操作已被篡改 用户 浏览器 受信任网站A 恶意网站B

攻击过程分步解读

用户登录受信任网站A

用户访问恶意网站B

<!-- 恶意网站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. 用户已登录受信任网站A:攻击依赖用户的活跃会话。
  2. 网站A未启用CSRF防护:如未校验 Token、Referer 或二次验证。
  3. 请求参数可预测:例如通过 GET 请求执行敏感操作(如 GET /转账?to=攻击者)。

防御措施(引用自网页5、网页6)

通过顺序图可以看出,CSRF 攻击的 核心逻辑是滥用浏览器的 Cookie 自动携带机制,而防御的关键在于 阻断攻击者伪造请求的能力。

Security的CSRF简介

根据 Spring Security 的官方设计理念及社区实践(综合多个技术文档和博客),其 CSRF 防护机制的核心逻辑如下:

一、Spring Security 的 CSRF 防护机制

默认启用的防护

自动拦截:Spring Security 从 4.0 版本起默认启用 CSRF 保护,通过 CsrfFilter 拦截所有非安全 HTTP 方法(如 POST、PUT、DELETE)的请求。

Token 验证流程:

核心组件

配置示例:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
}

前端集成方式

表单页面:通过模板引擎(如 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 }
});

扩展防护策略

二、未启用 CSRF 防护的危害场景

如果未启用 CSRF 防护,攻击者可利用以下漏洞发起攻击:

伪造用户操作:

<img src="http://bank.com/transfer?to=attacker&amount=10000">

数据篡改与泄露:

企业级风险:

三、官方文档的补充说明

虽然未直接引用 spring.io 官网,但以上机制与官方文档一致(可通过 Spring Security 官方文档 验证):

总结

Spring Security 通过 CSRF Token 的生成与验证机制 有效防御跨站请求伪造攻击。若未启用防护,攻击者可利用用户已登录的会话劫持敏感操作,导致数据泄露、资金损失等严重后果。开发者应结合业务场景选择 Token 存储方式(Session/Cookie),并确保前端正确集成 Token。

CSRF防范的必要参数

以下是标准的CSRF防护参数及其生成、使用和失效规则的总结表格,结合多个技术文档和实践案例:

参数名称生成者生成时机使用时机失效条件
CSRF Token服务端用户首次访问受保护页面时生成在提交表单或发起状态变更请求(如POST/PUT/DELETE)时携带会话过期失效、单次使用后失效(单次有效性)、超出时间窗口(如5-10分钟)
SameSite Cookie服务端用户首次登录时生成浏览器自动管理,用于限制跨域请求携带CookieCookie过期失效、浏览器关闭(根据SameSite策略)
二次验证参数服务端或第三方系统用户触发敏感操作(如转账)时生成执行关键操作前需二次验证(如短信验证码)验证码使用后失效、超时失效(如5分钟)

详细说明

CSRF Token

失效条件:

SameSite Cookie

生成者:服务端在用户登录时生成会话Cookie,并设置SameSite属性。

使用规则:

二次验证参数

引用来源

通过上述参数组合(如Token+SameSite+二次验证),可构建多层防御体系,有效阻断CSRF攻击。

Security是怎么防范的

Spring Security 通过 CSRF Token 验证机制 和 防御策略组合 来避免 CSRF 攻击,以下是其核心实现逻辑及关键步骤:

一、CSRF Token 验证机制

生成与存储 Token

客户端携带 Token

在 HTML 表单中通过隐藏字段嵌入 Token。例如使用 Thymeleaf 模板引擎自动注入:

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

通过请求头传递 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 }
});

服务端验证 Token

二、防御策略扩展

SameSite Cookie 属性

通过设置 Cookie 的 SameSite 属性限制跨域请求携带 Cookie:

 配置示例:

@Bean
public CsrfTokenRepository csrfTokenRepository() {
    CookieCsrfTokenRepository repository = new CookieCsrfTokenRepository();
    repository.setSameSite("Lax");
    return repository;
}

双重验证(Double Submit Cookie)

安全方法限制

三、配置与最佳实践

启用与禁用

默认启用:Spring Security 4.0+ 默认开启 CSRF 防护。

http.csrf().disable();

前后端分离配置

http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());

前端从 Cookie 读取 Token 并添加到请求头。

最佳实践

总结

Spring Security 通过 CSRF Token 的生成、传递与验证机制,结合 SameSite Cookie 和 双重验证 等策略,有效阻断攻击者伪造请求的能力。其设计兼顾灵活性与安全性,开发者需根据架构(如传统 MVC 或前后端分离)选择合适的 Token 存储方式,并遵循最佳实践以确保全面防护。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文