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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;游戏开…