Spring Security 如何防止 CSRF 攻击?
目录
- 一、CSRF 攻击简介
- 二、Spring Security 防止 CSRF 攻击的机制
- 1. 默认启用 CSRF 保护
- 2. CSRF 令牌的生成与验证
- 3. 配置与自定义
- 4. 在请求中包含 CSRF 令牌
- 三、最佳实践
- 四、总结
一、CSRF 攻击简介
CSRF(Cross-Site Request Forgery)攻击,即跨站请求伪造攻击,是一种利用用户已登录的身份,在用户不知情的情况下,强制其执行非预期操作的攻击方式。攻击者通常会通过伪造的请求,诱使用户在已登录的应用程序中执行恶意操作,例如转账、修改个人信息等。
二、Spring Security 防止 CSRF 攻击的机制
1. 默认启用 CSRF 保护
从 Spring Security 4.0 开始,默认情况下会启用 CSRF 保护。这意味着对于 PATCH、POST、PUT 和 DELETE 方法的请求,Spring Security 会自动进行 CSRF 验证。
2. CSRF 令牌的生成与验证
Spring Security 通过生成唯一的 CSRF 令牌(Token)来防止 CSRF 攻击。具体流程如下:
- 生成 CSRF 令牌:服务器在处理请求时,会生成一个唯一的 CSRF 令牌,并将其存储在用户的会话(HttpSession)或 Cookie 中。
- 客户端提交 CSRF 令牌:客户端在提交表单或发送 AJAX 请求时,需要将 CSRF 令牌包含在请求中。通常,这个令牌会作为表单的一个隐藏字段或请求头的一部分发送。
- 服务器验证 CSRF 令牌:服务器在接收到请求后,会从请求中提取 CSRF 令牌,并与存储在会话或 Cookie 中的令牌进行比较。如果两者一致,则认为请求是合法的;如果不一致,则认为是 CSRF 攻击,服务器会拒绝该请求。
3. 配置与自定义
- 开启或关闭 CSRF 保护:可以通过配置来开启或关闭 CSRF 保护。例如,在基于 Java 配置的项目中,可以通过以下代码关闭 CSRF 保护:
或者在基于 XML 配置的项目中,使用以下代码:http.csrf().disable();
<security:csrf disabled="true"/>
- 自定义 CSRF 令牌存储方式:Spring Security 提供了
CsrfTokenRepository
接口,开发者可以实现该接口来自定义 CSRF 令牌的存储和获取方式。默认实现是HttpSessionCsrfTokenRepository
,它将 CSRF 令牌存储在 HttpSession 中。
4. 在请求中包含 CSRF 令牌
- 表单提交:在 HTML 表单中,可以通过 Thymeleaf 等模板引擎自动包含 CSRF 令牌。例如:
<form action="/submit" method="POST"><input type="hidden" name="_csrf" value="${_csrf.token}" /><button type="submit">Submit</button> </form>
- AJAX 请求:在使用 AJAX 提交请求时,需要手动将 CSRF 令牌添加到请求头中。例如,使用 jQuery 时可以这样操作:
在 HTML 中,需要包含 CSRF 令牌的 meta 标签:$.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);} });
<meta name="_csrf" content="${_csrf.token}" />
三、最佳实践
- 始终启用 CSRF 保护:除非有充分的理由,否则应始终启用 CSRF 保护,以确保应用程序的安全性。
- 使用 HTTPS:通过使用 HTTPS,可以防止攻击者拦截和篡改请求,从而提高应用程序的安全性。
- 限制 CSRF 令牌的作用域:可以配置 CSRF 令牌仅对特定的端点有效,从而减少潜在的安全风险。
- 定期更新依赖:及时更新 Spring Security 和其他相关依赖,以修复已知的安全漏洞。
四、总结
Spring Security 提供了强大的 CSRF 防护机制,通过生成和验证 CSRF 令牌,有效防止了 CSRF 攻击。开发者可以通过配置和自定义来满足不同的安全需求,同时遵循最佳实践,确保应用程序的安全性。
相关文章:

Spring Security 如何防止 CSRF 攻击?
目录 一、CSRF 攻击简介二、Spring Security 防止 CSRF 攻击的机制1. 默认启用 CSRF 保护2. CSRF 令牌的生成与验证3. 配置与自定义4. 在请求中包含 CSRF 令牌 三、最佳实践四、总结 一、CSRF 攻击简介 CSRF(Cross-Site Request Forgery)攻击࿰…...

使用 Kubeflow 和 Ray 构建机器学习平台
使用 Kubeflow 和 Ray 构建一个稳健的 ML 平台。我们将深入讨论 Kubeflow 和 Ray 的独特功能,以及它们如何互补,共同创建一个强大的 ML 生态系统 集中化 ML 平台的需求 随着企业在 ML 旅程中的成熟,初始 ML 项目的临时性质逐渐让位于对更结构化和可扩展方法的需求。集中化…...
SEO炼金术(4)| Next.js SEO 全攻略
在上一篇文章 SEO炼金术(3)| 深入解析 SEO 关键要素 中,我们深入解析了 SEO 关键要素,包括 meta 标签、robots.txt、canonical、sitemap.xml 和 hreflang,并探讨了它们在搜索引擎优化(SEO)中的作…...
每日十个计算机专有名词 (7)
Metasploit 词源:Meta(超越,超出) exploit(漏洞利用) Metasploit 是一个安全测试框架,用来帮助安全专家(也叫渗透测试人员)发现和利用计算机系统中的漏洞。你可以把它想…...

StarRocks 在爱奇艺大数据场景的实践
作者:林豪,爱奇艺大数据 OLAP 服务负责人 小编导读: 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享,介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中,StarRocks 替换 ImpalaKudu 后&#x…...

蓝桥杯好题推荐----高精度乘法
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 题目链接 P1303 A*B Problem - 洛谷https://www.luogu.com.cn/problem/P1303 解题思路 这道题的思路,其实和前面差不多,我们主要说一下最为关键的部分&…...

Linux网络 数据链路层
在Linux网络中,数据链路层位于物理层之上,网络层之下,其主要职责是将网络层的IP数据包封装成帧,并通过物理链路发送到目标设备。同时,它还负责接收来自物理层的帧,并将其解封装为数据包,传递给网…...

量子计算可能改变世界的四种方式
世界各地的组织和政府正将数十亿美元投入到量子研究与开发中,谷歌、微软和英特尔等公司都在竞相实现量子霸权。 这其中的利害关系重大,有这么多重要的参与者,量子计算机的问世可能指日可待。 为做好准备,,我们必须了…...

React 组件基础介绍
基本概念:一个组件就是用户界面的一部分,可以有自己的逻辑和外观,组件之间可以互相嵌套、复用多次。每个组件就是一个首字母大写的函数,内部存放了组件的逻辑和试图UI,渲染组件只需要把组件 当成 标签 书写。App 可以视…...
ETL系列-数据抽取(Extract)
ETL的过程 1、数据抽取:确定数据源,定义数据接口,选择数据抽取方法(主动抽取或由源系统推送)。 2、数据清洗:处理不完整数据、错误数据、重复数据等,确保数据的准确性和一致性。(是…...
java八股文之框架
1.Spring框架中的Bean是否线程安全的 Spring框架中的Bean默认是单例的,不是线程安全的。因为一般在Spring的bean的中都是注入无状态的对象,没有线程安全问题,如果在bean中定义了可修改的成员变量,是要考虑线程安全问题的…...

【大模型】Ubuntu下 fastgpt 的部署和使用
前言 本次安装的版本为 fastgpt:v4.8.8-fix2。 最新版本fastgpt:v4.8.20-fix2 问答时报错,本着跑通先使用起来,就没有死磕下去,后面bug解了再进行记录。 github连接:https://github.com/labring/FastGPT fastgpt 安装说明&…...
小程序中头像昵称填写
官方文档 参考小程序用户头像昵称获取规则调整公告 新的小程序版本不能通过wx.getUserProfile和wx.getUserInfo获取用户信息 <van-field label"{{Avatar}}" label-class"field-label" right-icon-class"field-right-icon-class"input-class&…...

卷积神经网络(cnn,类似lenet-1,八)
我们第一层用卷积核,前面已经成功,现在我们用两层卷积核: 结构如下,是不是很想lenet-1,其实我们24年就实现了sigmoid版本的: cnn突破九(我们的五层卷积核bpnet网络就是lenet-1)-CS…...

【NLP 27、文本分类任务 —— 传统机器学习算法】
不要抓着枯叶哭泣,你要等待初春的新芽 —— 25.1.23 一、文本分类任务 定义:预先设定好一个文本类别集合,对于一篇文本,预测其所属的类别 例如: 情感分析: 这家饭店太难吃了 —> 正类 …...

Go红队开发—并发编程
文章目录 并发编程go协程chan通道无缓冲通道有缓冲通道创建⽆缓冲和缓冲通道 等协程sync.WaitGroup同步Runtime包Gosched()Goexit() 区别 同步变量sync.Mutex互斥锁atomic原子变量 SelectTicker定时器控制并发数量核心机制 并发编程阶段练习重要的细节端口扫描股票监控 并发编程…...
Oracle 导出所有表索引的创建语句
在Oracle数据库中,导出所有表的索引创建语句通常涉及到使用数据字典视图来查询索引的定义,然后生成对应的SQL语句。你可以通过查询DBA_INDEXES或USER_INDEXES视图(取决于你的权限和需求)来获取这些信息。 使用DBA_INDEXES视图 如…...
使用Docker方式一键部署MySQL和Redis数据库详解
一、前言 数据库是现代应用开发中不可或缺的一部分,MySQL和Redis作为两种广泛使用的数据库系统,分别用于关系型数据库和键值存储。本文旨在通过Docker和Docker Compose的方式,提供一个简洁明了的一键部署方案,确保数据库服务的稳…...

2020年蓝桥杯Java B组第二场题目+部分个人解析
#A:门牌制作 624 解一: public static void main(String[] args) {int count0;for(int i1;i<2020;i) {int ni;while(n>0) {if(n%102) {count;}n/10;}}System.out.println(count);} 解二: public static void main(String[] args) {…...

[深度学习] 大模型学习2-提示词工程指北
在文章大语言模型基础知识里,提示词工程(Prompt Engineering)作为大语言模型(Large Language Model,LLM)应用构建的一种方式被简要提及,本文将着重对该技术进行介绍。 提示词工程就是在和LLM聊…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...

如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...