SpringSecurity的核心过滤器-CsrfFilter

news/2025/2/25 18:37:57

  Spring Security除了认证授权外功能外,还提供了安全防护功能。本文我们来介绍下SpringSecurity中是如何阻止CSRF攻击的。

一、什么是CSRF攻击

  跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

  跨站请求攻击,简单地说,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并运行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去运行。这利用了 web 中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。举个例子如下:

image.png

二、解决方案

1.检查Referer字段

  HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。以上文银行操作为例,Referer字段地址通常应该是转账按钮所在的网页地址,应该也位于www.bankchina.com之下。而如果是CSRF攻击传来的请求,Referer字段会是包含恶意网址的地址,不会位于www.bankhacker.com之下,这时候服务器就能识别出恶意的访问。

image.png

  这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的Referer字段。虽然http协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其Referer字段的可能。

2.CsrfToken

  其实CSRF攻击是在用户登录且没有退出浏览器的情况下访问了第三方的站点而被攻击的,完全是携带了认证的cookie来实现的,我们只需要在服务端响应给客户端的页面中绑定随机的信息,然后提交请求后在服务端校验,如果携带的数据和之前的不一致就认为是CSRF攻击,拒绝这些请求即可。

image.png

三、SpringSecurity是如何防止CSRF攻击的

  首先从 Spring Security 4.0 开始,默认情况下会启用 CSRF 保护,以防止 CSRF 攻击应用程序,Spring Security CSRF 会针对 PATCH,POST,PUT 和 DELETE 方法进行防护。

1.开启关闭CSRF防御

  在SpringSecurity中默认是开启csrf防御的,我们可以通过一下配置来关闭csrf防御

http.csrf().disable();

或者在基于配置文件的使用中使用如下操作关闭

<security:csrf disabled="true"/>

2.SpringSecurity的实现

2.1 CSRF的原理

  1. 生成csrfToken保存到HttpSession或者Cookie中
  2. 请求到来时,程序会从请求中获取提交的csrfToken,同时会从HttpSession中获取之前存储的csrfToken进行比较,如果相同则认为是合法的请求,继续后面的操作,如果不相等则认为是CSRF工具,拒绝该请求

2.2 源码分析

  然后我们来看下SpringSecurity中的代码是如何实现的。我们主要看的是 spring-security-web.jar中的

org.springframework.security.web.csrf包下的源码。

image.png

2.2.1 CsrfToken

  CsrfToken是一个非常简单的接口,定义了Token令牌,消息头和请求参数。

public interface CsrfToken extends Serializable {
   

	/**
	 * 获取我们放置在请求头中CSRF随机值的名称
	 */
	String getHeaderName();

	/**
	 * 获取请求体中的csrf随机值的参数名称
	 */
	String getParameterName();

	/**
	 * 返回具体的Token值
	 */
	String getToken();

}

CsrfToken的默认实现是DefaultCsrfToken。

image.png

2.2.2 CsrfTokenRepository

  CsrfTokenRepository接口也非常简单,定义了Token的生成,存储和获取的相关API

public interface CsrfTokenRepository {
   

	/**
	 * 生成Token
	 */
	CsrfToken generateToken(HttpServletRequest request);

	/**
	 * 存储生成的Token
	 */
	void saveToken(CsrfToken token, HttpServletRequest request, HttpServletResponse response);

	/**
	 * 返回Token
	 */
	CsrfToken loadToken(HttpServletRequest request);

}

CsrfTokenRepository的实现在SpringSecurity中有两个实现。

image.png

默认的实现是HttpSessionCsrfTokenRepository。是一个基于HttpSession保存csrfToken的实现。

public final class HttpSessionCsrfTokenRepository implements CsrfTokenRepository {
   

	private static final String DEFAULT_CSRF_PARAMETER_NAME

http://www.niftyadmin.cn/n/5865838.html

相关文章

deepseek 导出导入模型(docker)

前言 实现导出导入deepseek 模型。deepseek 安装docker下参考 docker 导出模型 实际生产环境建议使用docker-compose.yml进行布局&#xff0c;然后持久化ollama模型数据到本地参考 echo "start ollama" docker start ollama#压缩容器内文件夹&#xff0c;然后拷贝…

Rust 中的引用循环与内存泄漏

一、引用计数与引用循环 在 Rust 中&#xff0c;Rc<T> 允许多个所有者共享同一个数据&#xff0c;当调用 Rc::clone 时&#xff0c;会增加内部的引用计数&#xff08;strong_count&#xff09;。只有当引用计数降为 0 时&#xff0c;对应的内存才会被释放。 然而&#…

番外·卓伊凡参加 [2025年2月HDD·鸿蒙赋能交流会·成都站] 线下活动的心得体会-优雅草卓伊凡

番外卓伊凡参加 [2025年2月HDD鸿蒙赋能交流会成都站] 线下活动的心得体会-优雅草卓伊凡 背景 2025 年 2 月 22 日&#xff0c;HDD・鸿蒙赋能交流会将在北京、长沙、成都、南京、雄安同步开展。此次交流会由 HDG 组织者牵头&#xff0c;携手 HUAWEI DEVELOPER EXPERTS&#xf…

Github更新本地仓库到远程总是失败文件过大,如何解决。

环境&#xff1a; AI-Sphere-Butler 问题描述&#xff1a; Github更新本地仓库到远程总是失败文件过大&#xff0c;如何解决。 解决方案&#xff1a; 问题核心在于 历史提交中仍然存在未被 LFS 正确追踪的大文件。 终极解决方案 (必须按顺序执行) 第一步&#xff1a;修…

测试用例的Story是什么?

测试用例的 Story&#xff08;用户故事&#xff09;是指描述某个功能或场景的具体用户需求&#xff0c;它通常以简短的业务背景用户操作期望结果的方式呈现&#xff0c;使测试人员能够理解测试的目标和价值。用户故事能够帮助团队更好地设计测试用例&#xff0c;确保功能满足用…

JavaScript系列(85)--包管理工具详解

JavaScript 包管理工具详解 &#x1f4e6; 包管理工具是现代前端开发的重要基础设施&#xff0c;它帮助我们管理项目依赖、版本控制和包发布。让我们深入了解主流的包管理工具及其最佳实践。 包管理工具概述 &#x1f31f; &#x1f4a1; 小知识&#xff1a;npm&#xff08;N…

GB 44496-2024《汽车软件升级通用技术要求》标准解读|标准结构、测试方法、测试内容

2024年08月23日&#xff0c;我国工业和信息化部发布了GB 44496-2024《汽车软件升级通用技术要求》&#xff0c;该标准将于2026年01月01日起实施。该标准是一项强制性国家标准&#xff0c;适用于M类、N类和O类汽车。自该项标准实施之日起&#xff0c;所有需要申请道路机动车辆产…

基于springboot的学习社区博客

一、系统架构 前端&#xff1a;html | bootstarp | jquery | css | ajax 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、代码及数据 三、功能介绍 01. web端-注册 02. web端-登录 03. web端-首页 04. web端-文章明…