首页 > 其他分享 >Spring (33)CSRF(跨站请求伪造)保护

Spring (33)CSRF(跨站请求伪造)保护

时间:2024-06-02 09:32:18浏览次数:23  
标签:令牌 跨站 请求 33 Spring CsrfFilter request CSRF csrfToken

跨站请求伪造(CSRF)是一种常见的网络攻击手段,它允许攻击者在不知情的用户浏览器中发起恶意请求。这种攻击利用了网站对用户浏览器的信任。如果用户在浏览器中已经登录了一个网站,攻击者就可以构造一个请求,这个请求能够利用用户的登录状态在该网站上执行未授权的操作。

CSRF保护机制

为了防御CSRF攻击,网站需要确保它们只接受那些明确意图发起的请求。一种常见的防御手段是使用CSRF令牌(也称为CSRF令牌)。这个令牌是一个随机值,服务器在渲染表单时生成并包含在表单中,随后,任何对服务器的请求都需要包含这个令牌。由于攻击者无法访问这个令牌,他们构造的恶意请求将会失败。

Spring Security中的CSRF保护

Spring Security 提供了内置的CSRF保护机制。默认情况下,它会为所有的POST、PUT、PATCH和DELETE请求启用CSRF保护。它通过CsrfFilter过滤器实现这一功能。

CsrfFilter工作原理

CsrfFilter激活时,它会在每个请求上执行以下操作:

  1. 检查CSRF令牌:如果请求是一个需要被保护的HTTP方法(例如POST),它会检查请求中是否含有有效的CSRF令牌。
  2. 生成和存储CSRF令牌:对于每个新的会话,CsrfFilter会生成一个新的CSRF令牌,并在服务器端存储这个令牌。令牌也会被发送到客户端,通常是作为一个表单的隐藏字段。
  3. 验证CSRF令牌:当用户提交一个表单时,客户端发送的令牌必须与服务器端存储的令牌匹配。如果令牌不匹配,请求将被拒绝。
CSRF保护的配置

在Spring Security配置中,默认已经启用了CSRF保护。但是,你可以按需修改或禁用这一功能。以下是一个示例,展示如何在Spring Security配置中自定义CSRF保护:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 其他配置...
            .csrf(csrf -> 
                csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            );
            // 此配置使用了基于Cookie的CSRF令牌存储策略,并将CSRF令牌作为一个JavaScript可访问的cookie发送给客户端。
    }
}
生成和验证CSRF令牌的源码解析

CsrfFilter类是Spring Security中处理CSRF保护逻辑的关键。在源码层面,CsrfFilter会使用一个CsrfTokenRepository来存储CSRF令牌。默认情况下,使用的是HttpSessionCsrfTokenRepository,但你可以通过配置改变这一行为。

当处理请求时,CsrfFilter会调用CsrfTokenRepository来加载当前的CSRF令牌,检查请求中的令牌是否与之匹配。匹配逻辑主要在CsrfFilterdoFilterInternal方法中实现:

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
    CsrfToken csrfToken = this.tokenRepository.loadToken(request);
    final boolean missingToken = csrfToken == null;
    if (missingToken) {
        csrfToken = this.tokenRepository.generateToken(request);
        this.tokenRepository.saveToken(csrfToken, request, response);
    }
    request.setAttribute(CsrfToken.class.getName(), csrfToken);
    request.setAttribute(csrfToken.getParameterName(), csrfToken);

    if (!this.requireCsrfProtectionMatcher.matches(request)) {
        filterChain.doFilter(request, response);
        return;
    }

    String actualToken = request.getHeader(csrfToken.getHeaderName());
    if (!csrfToken.getToken().equals(actualToken)) {
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Invalid CSRF token found for " + UrlUtils.buildFullRequestUrl(request));
        }
        if (missingToken) {
            this.accessDeniedHandler.handle(request, response, new MissingCsrfTokenException(actualToken));
        }
        else {
            this.accessDeniedHandler.handle(request, response, new InvalidCsrfTokenException(csrfToken, actualToken));
        }
        return;
    }

    filterChain.doFilter(request, response);
}

从上面的代码可以看出,CsrfFilter首先尝试从存储中加载CSRF令牌。如果没有找到,它会生成一个新的令牌。然后,它检查如果请求需要CSRF保护,请求中的令牌必须与存储中的令牌匹配。

通过这种机制,Spring Security提供了一种强大的方式来自动防御CSRF攻击,同时也提供了足够的灵活性,以适应不同应用的需求。

标签:令牌,跨站,请求,33,Spring,CsrfFilter,request,CSRF,csrfToken
From: https://blog.csdn.net/qq_43012298/article/details/136941150

相关文章

  • Spring (32)Spring Security的过滤器链
    SpringSecurity的安全模型核心之一是一系列过滤器,这些过滤器组成了一个链。这个过滤器链负责处理进入应用的每个HTTP请求,实现认证、授权等安全功能。每个过滤器都有其特定的责任,它们按照特定的顺序执行。过滤器链概念在SpringSecurity中,过滤器链是通过FilterChainPr......
  • Spring Boot整合PageHelper
    文章目录概念前置内容SpringBoot整合PageHelper参考来源概念PageHelper是Mybatis的分页插件前置内容SpringBoot快速整合SpringMVC和Mybatis-Plus,实现基本的增删改查功能SpringBoot整合PageHelper引入maven依赖<!--PageHelper--><dependency>......
  • AI编程新手快速体验SpringCloud Alibaba 集成AI功能
    上周六写了一篇文章  震撼发布!SpringAI框架重磅上线,Java集成AI轻松搞定!   部分同学可能没有科学上网的条件,本地ollama集成又比较笨重。趁着周六,写一篇基于SpringCloudAlibaba集成AI的文章。先简单介绍下SpringCloudAlibabaAI。SpringCloudAlibabaAI基......
  • 免费分享一套微信小程序图书借阅(图书管理)系统(SpringBoot后端)
    大家好,我是java1234_小锋老师,看到一个不错的微信小程序图书借阅(图书管理)系统(,分享下哈。项目介绍该项目是一套图书馆信息管理系统,包括用户小程序以及后台管理系统,基于SpringBoot+MyBatis实现。前台商城系统包含用户注册登录、首页门户、图书查询、在线借阅、个人中心、我......
  • Java项目:springBoot汽车销售管理系统(计算机毕业设计)
    作者主页:Java毕设网 简介:Java领域优质创作者、Java项目、学习资料、技术互助文末获取源码一、项目介绍本项目基于springboot以及Vue开发,为前后端分离的项目。针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能,提供经理和销售两种角色进行管......
  • 初学者springboot启动报错Caused by: java.lang.IllegalArgumentException: Invalid v
    本人第一次接触springboot框架本来想用mybatis连接数据库,引入mybatisplus配置就启动报错packagecom.hu.springboot_mybatis.dao;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.hu.springboot_mybatis.pojo.UserPojo;importorg.apache.ibatis.ann......
  • Springboot 开发 -- 统一异常处理最佳实践
    引言在企业级应用开发中,异常处理是保障系统稳定性和可维护性的关键环节。SpringBoot提供了一系列优雅的异常处理机制,帮助开发者更高效地管理和响应异常情况。本文将总结SpringBoot中异常处理的最佳实践。一、异常处理原则在进行异常处理之前,需要明确几个基本的处理......
  • 浅谈SpringBoot配置文件
    文章目录一、配置文件作用二、配置文件分类三、SpringBoot内置的配置文件格式3.1、.properties3.1.1、.properties配置语法3.1.2、.properties读取方式3.2、.yml/.yaml3.2.1、.yml配置语法3.2.2、.yml读取形式四、两种配置文件优缺点4.1、.properties4.2、.yml4.2.1、......
  • 【实战教程】构建可复用的 Spring Boot starter 微服务组件
    案例Demo:https://gitee.com/regexpei/coding-trainee/tree/demo/20240526_starter介绍在SpringBoot中,starter启动依赖就像一个“开箱即用”的工具箱,它包含了第三方组件的配置和依赖,让我们无需手动配置和添加这些组件。通过starter,我们可以轻松地将通用的代码和配......
  • SpringBootWeb 篇-深入了解 Filter 过滤器与 Interceptor 拦截器(实现登录校验 Filter
    ......