Spring Framework CVE-2020-5408 CORS 配置漏洞

news2024/12/26 7:35:21

文章目录

  • 0.前言
  • 1.参考文档
  • 2.基础介绍
  • 3.解决方案
    • 3.1. `@CrossOrigin`限制指定来源
    • 3.1. `@ `WebMvcConfigurer` 限制指定来源
    • 3.3. 其他用法
      • 1. 在方法上使用`@CrossOrigin`:
      • 2. 在Controller上使用`@CrossOrigin`:
      • 3. 设置多个源:
      • 4. 设置所有源:
      • 5. 设置允许的HTTP方法:
      • 6. 设置允许的请求头:
      • 7. 设置是否支持凭证:

在这里插入图片描述

0.前言

背景: 一直零散的使用着Spring Boot 的各种组件和特性,从未系统性的学习和总结,本次借着这个机会搞一波。共同学习,一起进步。哈哈

CVE-2020-5408 是一个在Spring Framework中的跨站请求伪造(Cross-Site Request Forgery, CSRF)漏洞。该漏洞主要是由于Spring Framework在处理跨站资源共享(Cross-Origin Resource Sharing, CORS)时的错误配置。

请注意,对于已经在生产环境中运行的应用,修改CORS配置可能会影响到正常的功能。因此,在实施这个修复之前,应该先进行充分的测试。

1.参考文档

官方的Spring文档对@CrossOrigin注解的描述:Spring Framework - Enabling CORS
Spring Framework的CORS配置如果不正确可能导致跨站请求伪造攻击(CSRF)。为了减少这种风险 应该遵循以下最佳实践:

  1. 不要允许所有的源(即避免使用@CrossOrigin(origins = "*"))。相反, 应该明确指定允许的源。我后面会有示例

  2. 限制允许的HTTP方法。例如,你可能只想允许GET和POST请求。这种我们基本都不会限制死,其实价值也不大

  3. 如果可能,避免允许带有凭证的请求。如果你必须允许带凭证的请求,那么确保应用程序在处理这些请求时有足够的安全措施

  4. 在CORS(跨源资源共享)中,一个跨源的请求默认情况下不会发送任何凭据信息,比如HTTP Cookies或HTTP Authentication信息。这样设计的目的是出于安全考虑,防止用户的敏感数据被非法利用。

然而,有时候,我们确实需要在跨源请求中携带这些凭据信息。比如,我们可能需要访问另一个域名下的某个API,而这个API又需要我们提供身份验证信息才能成功访问。在这种情况下,我们可以设置CORS配置,允许请求带有凭证。

在Fetch API或XMLHttpRequest中,我们可以通过设置credentials选项为include来实现这一点。而在服务器端,比如使用Spring框架,我们可以通过在@CrossOrigin注解中设置allowCredentialstrue来允许请求带有凭证。

如果服务器允许请求带有凭证,那么它就不能在处理CORS请求时将Access-Control-Allow-Origin头设置为*,因为浏览器会出于安全考虑而阻止这样的请求。服务器必须明确指定允许的源。

有关CORS和CSRF的参考资料:

  • Spring Framework - CORS

  • MDN Web Docs - Cross-Origin Resource Sharing (CORS)

  • OWASP - Cross-Site Request Forgery (CSRF)

2.基础介绍

简单来说,CORS是一种安全机制,用于控制哪些外部源可以访问到你的应用。在默认情况下,浏览器会阻止跨源(即,不同的域、协议或端口)的 HTTP 请求,以保护用户的隐私。然而,CORS 允许开发者指定哪些外部源可以访问应用,从而打破了这个限制。

在CVE-2020-5408中,Spring Framework的默认CORS配置允许所有的外部源访问应用。这意味着,一个恶意的外部源可以在用户不知情的情况下发起请求,这可能会导致诸如数据泄露、账户劫持等问题。

为了修复这个漏洞,开发者需要显式地配置CORS,指定哪些外部源可以访问应用。例如,可以使用 @CrossOrigin 注解来限制特定的控制器或处理器方法,或者在全局范围内配置 WebMvcConfigurer。这样,只有信任的外部源才能访问应用,从而防止跨站请求伪造攻击。

3.解决方案

3.1. @CrossOrigin限制指定来源

特定的控制器配置CORS。
@CrossOrigin 注解告诉Spring Framework只接受来自 http://trusted-domain.com 的请求。来自其他源的请求将被拒绝。

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    @CrossOrigin(origins = "http://trusted-domain.com")  // 只允许这个域的请求
    @GetMapping("/endpoint")
    public String getEndpoint() {
        return "Hello, World!";
    }
}

3.1. @ WebMvcConfigurer` 限制指定来源

如果需要为整个应用配置CORS,可以实现 WebMvcConfigurer 接口,如下所示:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MyConfiguration implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")  // 对所有的URL路径生效
                .allowedOrigins("http://trusted-domain.com")  // 只允许这个域的请求
                .allowedMethods("GET", "POST", "PUT", "DELETE");  // 允许的HTTP方法
    }
}

addCorsMappings 方法定义了一个CORS映射,它适用于所有的URL路径,并且只允许来自 http://trusted-domain.comGET, POST, PUT, DELETE 请求。

3.3. 其他用法

@CrossOrigin是一个Spring MVC提供的注解,用于处理CORS(跨源资源共享)。

1. 在方法上使用@CrossOrigin

@RestController
public class MyController {
    
    @CrossOrigin(origins = "http://domain2.com")
    @GetMapping("/endpoint")
    public String getEndpoint() {
        return "Hello, World!";
    }
}

@CrossOrigin注解用在了getEndpoint方法上,只有来自"http://domain2.com"的请求才能访问这个端点。

2. 在Controller上使用@CrossOrigin

@CrossOrigin(origins = "http://domain2.com")
@RestController
public class MyController {
    
    @GetMapping("/endpoint")
    public String getEndpoint() {
        return "Hello, World!";
    }
}

@CrossOrigin注解用在了MyController类上,意味着这个类中的所有方法都只允许"http://domain2.com"的请求。

3. 设置多个源:

@CrossOrigin(origins = {"http://domain1.com", "http://domain2.com"})

在这个示例中,允许"http://domain1.com"和"http://domain2.com"的请求。

4. 设置所有源:

@CrossOrigin(origins = "*")

在这个示例中,允许所有的请求,这个引发安全漏洞的配置,在生产环境禁止使用

5. 设置允许的HTTP方法:

@CrossOrigin(origins = "http://domain2.com", methods = {RequestMethod.GET, RequestMethod.POST})

只允许GET和POST请求。

6. 设置允许的请求头:

@CrossOrigin(origins = "http://domain2.com", allowedHeaders = {"header1", "header2"})

在这个示例中,只允许包含"header1"和"header2"的请求。

7. 设置是否支持凭证:

允许请求带有凭证。

@CrossOrigin(origins = "http://domain2.com", allowCredentials = "true")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/937822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx服务与调优

一、nginx概述: 1.Nginx简介: Nginx是一个高性能的HTTP和反向代理服务器。是一款轻量级的高性能的web服务器/反向代理服 务器/电子邮件(IMAP/POP3)代理服务器,单台物理服务器可支持30 000~50 000个并发请求…

初识umi

一、umi简介 Umi,中文发音为「乌米」,是可扩展的企业级前端应用框架。Umi 以路由为基础的,同时支持配置式路由和约定式路由,保证路由的功能完备,并以此进行功能扩展。然后配以生命周期完善的插件体系,覆盖…

运行命令出现错误 /bin/bash^M: bad interpreter: No such file or directory

在系统上运行一个 Linux 的命令的时候出现下面的错误信息: -bash: ./build.sh: /bin/bash^M: bad interpreter: No such file or directory 这个是在 Windows 作为 WSL 的时候出的错误。 原因和解决 出现问题的原因在于脚本在 Windows 中使用的回车换行和 Linux …

ANSYS软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 ANSYS是一款全球领先的工程仿真软件,广泛应用于机械、电气、流体、热力学等领域。它提供了强大的建模、网格划分、材料库、边界条件和载荷、求解器、结果后处理、批处理和脚本编程、多物理场仿真、协同设计和教育版等…

深入理解Android消息机制的原理

Handler & Looper & MessageQueue关系简述 一个线程至多有一个looper;一个looper有一个mq;一个mq对应多个message;一个message对应多个handler。消息类型:同步、异步、同步屏障消息。无限循环:在队列中没有消…

【C++从0到王者】第二十四站:多态的底层原理

文章目录 前言一、虚函数表二、一道经典的例题三、深度剖析多态的条件之一:为什么必须是父类的指针或引用四、深度剖析多态的条件之二:为什么是虚函数的重写/覆盖?五、虚函数表的一些总结六、关于Func3的验证七、动态绑定与静态绑定八、总结 …

数据分析作业2

中国在 2020 年开展第七次全国人口普查,截止 2021 年 5 月 11 日普查结果公布,全国人口共1411778724人。单从数据表格看相关数据不够直观,需要进行数据可视化展示,方便查看数据结果。 任务一:链接 MySQL 数据库&#x…

LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…

webassembly003 ggml GGML Tensor Library part-2 官方使用说明

https://github.com/ggerganov/whisper.cpp/tree/1.0.3 GGML Tensor Library 官方有一个函数使用说明,但是从初始版本就没修改过 : https://github1s.com/ggerganov/ggml/blob/master/include/ggml/ggml.h#L3-L173 This documentation is still a work in progres…

【档案专题】七、电子档案利用与开发

导读:主要针对电子档案利用与开发相关内容介绍。对从事电子档案管理信息化的职业而言,不断夯实电子档案管理相关理论基础是十分重要。只有通过不断梳理相关知识体系和在实际工作当中应用实践,才能走出一条专业化加职业化的道路,从…

8.缓冲区管理

第五章 I/O管理 缓冲区管理 双缓冲区&#xff1a;T<CM 假设初始状态缓冲区1满&#xff0c;缓冲区2空&#xff0c;工作区为空。 刚开始缓冲区2为空&#xff0c;所以设备可以向缓冲区2中冲入数据耗时T&#xff0c;另一方面刚开始缓冲区1中是满的&#xff0c;所以刚开始就可…

免费OCR图像识别文字识别API

免费OCR图像识别文字识别API 一、OCR图像识别文字识别二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、温馨提示 一、OCR图像识别文字识别 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;是指对文本资料的图像文件进行分析识别…

[管理与领导-55]:IT基层管理者 - 扩展技能 - 1 - 时间管理 -2- 自律与自身作则,管理者管好自己时间的五步法

前言&#xff1a; 管理好自己的时间&#xff0c;不仅仅是理念&#xff0c;也是方法和流程。 步骤1&#xff1a;理清各种待办事项 当提到工作事项时&#xff0c;这通常指的是要完成或处理的工作任务或事务。这些事项可以包括以下内容&#xff1a; 任务分配&#xff1a;根据工作…

2024年天津市大学软件学院专升本专业课考试大纲

天津市大学软件学院2024年“高职升本科”联合招生专业考试大纲 一、考试性质 天津市大学软件学院“高职升本科”联合招生专业考试是由合格的高职高专毕业生参加的选拔性考试。学校根据考生的成绩&#xff0c;按照已确定的招生计划&#xff0c;德、智、体全面衡量&#xff0c;…

fat32 文件系统 误删除文件数据恢复 SDK 介绍

fat32 文件系统 误删除文件数据恢复 SDK 介绍 fat32_analyze.dll 是一个专门用于恢复 fat32 文件系统误删除文件的标准的动态链接库(DLL)&#xff0c; 可被任何其他程序直接加载调用。 下载地址&#xff1a; https://gitee.com/tankaishuai/powerful_sdks/tree/master/fat32_a…

利用多种机器学习方法对爬取到的谷歌趋势某个关键词的每日搜索次数进行学习

大家好&#xff0c;我是带我去滑雪&#xff01; 前一期利用python爬取了谷歌趋势某个关键词的每日搜索次数&#xff0c;本期利用爬取的数据进行多种机器学习方法进行学习&#xff0c;其中方法包括&#xff1a;随机森林、XGBOOST、决策树、支持向量机、神经网络、K邻近等方法&am…

导入excel数据给前端Echarts实现中国地图-类似热力图可视化

导入excel数据给前端Echarts实现中国地图-类似热力图可视化 程序文件&#xff1a; XinqiDaily/frontUtils-showSomeDatabaseonMapAboutChina/finalproject xin麒/XinQiUtilsOrDemo - 码云 - 开源中国 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOr…

第五章 树与二叉树 二、二叉树的定义和常考考点

一、定义 二叉树可以用以下方式详细定义&#xff1a; 二叉树是由节点构成的树形结构&#xff0c;每个节点最多可以有两个子节点。每个节点有以下几个属性&#xff1a; 值&#xff1a;存储该节点的数据。左子节点&#xff1a;有一个左子节点&#xff0c;如果没有则为空。右子节…

大数据(四)主流大数据技术

大数据&#xff08;四&#xff09;主流大数据技术 一、写在前面的话 To 那些被折磨打击的好女孩&#xff08;好男孩&#xff09;&#xff1a; 有些事情我们无法选择&#xff0c;也无法逃避伤害。 但请你在任何时候都记住&#xff1a; 你可能在一些人面前&#xff0c;一文不值&a…

基于内存池的 简单高效的数据库 SDK简介

基于内存池的 简单高效的数据库 SDK简介 下载地址&#xff1a; https://gitee.com/tankaishuai/powerful_sdks/tree/master/shm_alloc_db_heap shm_alloc_db_heap 是一个基于内存池实现的简单高效的文件型数据存储引擎&#xff0c;利用它可以轻松地像访问内存块一样读、写、增…