Web安全 - 跨站点请求伪造CSRF(Cross Site Request Forgery)

文章目录

  • OWASP 2023 TOP 10
  • CSRF 导图
  • CSRF的基本概念
  • CSRF的工作原理
  • 常见CSRF攻击模式
  • CSRF防御策略
  • 补充建议
  • 应用场景实战
    • 防御策略选择
      • 1. CSRF Token(首选)
      • 2. SameSite Cookie属性
      • 3. 验证Referer和Origin
      • 4. 多因素认证
    • 实现方案
      • CSRF Token实现
      • SameSite Cookie设置
      • Referer和Origin头验证
      • 多因素认证 (MFA)

在这里插入图片描述

OWASP 2023 TOP 10

在这里插入图片描述

OWASP Top 10 概述

OWASP (Open Web Application Security Project) Top 10 是一份最常见和最危险的Web应用安全风险列表,由安全专家定期更新。 旨在提高开发人员、测试人员以及组织的安全意识并帮助他们预防这些漏洞。

2023年OWASP Top 10 列表

在这里插入图片描述

主流防范措施

  1. Broken Access Control

    • 描述:未能正确执行访问控制,允许用户访问他们不应该拥有的权限或资源。这可能导致数据泄露、数据篡改等问题。
    • 防御措施:严格实施基于角色的访问控制(RBAC),并确保敏感操作具有足够的授权检查。
  2. Cryptographic Failures

    • 描述:不当的加密实践或加密算法的使用不当,可能导致敏感数据(如密码、信用卡信息)被暴露或窃取。
    • 防御措施:使用最新的加密标准(如AES-256-GCM、RSA-2048),并避免使用弱或过时的加密算法。
  3. Injection

    • 描述:应用未能对用户输入进行有效的验证或转义,导致恶意代码注入(如SQL注入、命令注入)并执行在服务器上。
    • 防御措施:使用参数化查询、输入验证、输出转义技术,避免拼接SQL或动态代码。
  4. Insecure Design

    • 描述:系统在设计阶段未考虑安全问题,导致应用架构中的基本安全漏洞。
    • 防御措施:在开发生命周期中引入威胁建模、攻击面分析等设计阶段的安全审查。
  5. Security Misconfiguration

    • 描述:错误的配置(如不安全的默认设置、过时的软件或未配置的安全功能),可能使应用程序面临攻击。
    • 防御措施:定期审计和测试系统配置,使用自动化工具识别和修复配置问题。
  6. Vulnerable and Outdated Components

    • 描述:使用了具有已知漏洞或未及时更新的第三方库和组件,可能被攻击者利用。
    • 防御措施:确保使用依赖管理工具(如Maven、npm),并定期更新组件,避免使用过时的版本。
  7. Identification and Authentication Failures

    • 描述:认证和身份验证流程中的缺陷,可能导致用户冒充、会话劫持等问题。
    • 防御措施:实施强密码策略、使用多因素认证(MFA)和加固会话管理机制。
  8. Software and Data Integrity Failures

    • 描述:未能保证软件更新和数据的完整性,可能使攻击者篡改关键数据或上传恶意更新。
    • 防御措施:使用签名机制来验证更新包的完整性,确保数据在传输和存储过程中的可靠性。
  9. Security Logging and Monitoring Failures

    • 描述:缺乏适当的日志记录和监控,无法有效检测、响应或追踪安全事件。
    • 防御措施:实施集中化的日志记录、主动的监控和告警系统,确保能够及时发现并响应异常行为。
  10. Server-Side Request Forgery (SSRF)

    • 描述:攻击者通过伪造服务器端的请求来获取未授权的内部资源或数据,通常利用未受限制的服务器端请求机制。
    • 防御措施:限制服务器端可以发起的请求范围,避免允许用户输入直接控制服务器端的请求参数。

重点风险与防御措施建议

  1. Broken Access Control:最重要的防御措施是定期审查权限设计,确保每个用户只能访问必要的资源。建议结合应用的访问控制系统与自动化测试工具,确保权限配置不被篡改。

  2. Cryptographic Failures:确保敏感数据加密和密钥管理机制符合行业标准,如使用硬件安全模块(HSM)来保护密钥。避免明文传输或存储敏感数据。

  3. Injection:对于Web应用来说,防止注入攻击的最佳实践是始终使用参数化查询和预编译的语句。严禁直接拼接用户输入构建SQL或命令。

  4. Security Misconfiguration:安全配置管理应作为持续改进的一部分,尤其是在引入新服务或更新系统时,保持自动化的安全配置审计机制至关重要。

  5. SSRF:严格限制后端服务器能够访问的网络和资源,禁止对内部资源(如metadata或本地IP)发起请求。


CSRF 导图

在这里插入图片描述

CSRF的基本概念

CSRF (Cross-Site Request Forgery,跨站请求伪造) 是一种攻击方式,攻击者诱导用户在不知情的情况下发起非授权的请求。例如,用户在登录某个站点后,攻击者通过社交工程等手段诱使用户点击包含恶意请求的链接,利用用户已登录的状态,发起用户意图之外的操作,如转账、修改账户设置等。


CSRF的工作原理

  1. 用户登录受信任的站点A,并保持登录状态(通常通过cookie维持会话)。
  2. 攻击者在站点B或通过电子邮件等媒介诱导用户点击恶意链接,或者自动加载某些恶意内容。
  3. 浏览器在访问该恶意内容时自动带上站点A的cookie,导致恶意请求被认为是用户发起的合法请求。
  4. 站点A由于没有进行足够的防御措施,处理了该请求,执行了不符合用户预期的操作。

常见CSRF攻击模式

  • GET请求攻击:攻击者构造包含恶意查询参数的URL,并诱导用户点击或自动加载该URL。
  • POST请求攻击:攻击者通过隐藏的表单或JavaScript脚本在后台发送恶意POST请求。
  • 第三方内容加载:攻击者通过iframe、img等方式嵌入恶意请求,利用用户的认证状态。

CSRF防御策略

  1. 使用CSRF Token:在每次受保护的请求中,服务器生成一个唯一的CSRF Token,注入到表单或请求头中。服务器接收到请求时,检查Token的有效性。由于攻击者无法获取该Token,恶意请求将被服务器拒绝处理。

    • Synchronizer Token Pattern:服务器在用户的每个会话中生成唯一的Token,嵌入到页面的表单或请求中,服务器在处理请求时验证这个Token。
    • Double Submit Cookie:在页面中嵌入一个Token,同时将该Token保存在cookie中,服务器在接收到请求时对比两个Token的值。
  2. 使用SameSite Cookie属性:通过将cookie的SameSite属性设置为"Strict"或"Lax",限制跨站请求时自动发送cookie。此属性允许服务器防止来自外部站点的请求利用用户的认证状态。

    • Strict模式:完全禁止跨站点发送cookie,适用于高度安全要求的应用场景。
    • Lax模式:在安全性和用户体验之间做权衡,允许某些跨站请求(如GET请求)发送cookie,但限制POST请求。
  3. 验证Referer和Origin头:服务器可以检查请求的RefererOrigin头,确保请求来源于合法的站点。虽然不总是可靠,但可以作为额外的安全防线。

  4. 多因素认证(MFA):对于敏感操作,可以要求用户进行额外的身份验证,如验证码或短信验证,防止攻击者即便利用用户的认证状态,也无法完成关键操作。

  5. 使用CAPTCHA:通过在敏感请求前引入CAPTCHA,阻止自动化脚本提交伪造请求。


补充建议

  • 最小化攻击面:限制敏感操作的请求方法,比如将敏感操作从GET转为POST,并确保所有修改数据的操作都经过授权验证。
  • 对API接口的保护:对于RESTful API等接口,应确保请求都包含CSRF防护机制,特别是在允许跨域请求的情况下(如CORS)。

应用场景实战

假设场景为一个典型的Web应用,涉及用户登录、账户操作、表单提交等敏感操作。该应用具备以下特点:

  • 用户通过登录操作获得会话,并使用Cookie维持会话状态。
  • 存在表单提交和数据修改操作。
  • 系统允许跨域请求访问部分资源。

主要风险包括:

  • 恶意用户通过构造跨站请求,伪造受害者身份执行操作。
  • 特别是在敏感操作(如修改密码、交易等)上,CSRF的风险尤为显著。

防御策略选择

基于应用场景,综合考虑以下策略:

1. CSRF Token(首选)

  • 对于所有用户提交表单的敏感操作(如账户设置、转账等),服务器生成并验证CSRF Token。这是最可靠的防御机制。
  • 适用范围:几乎所有敏感操作场景,尤其是表单提交。

2. SameSite Cookie属性

  • 针对GET请求或跨站资源请求较多的场景,推荐设置SameSite=LaxStrict。这可以有效防止浏览器自动发送Cookie给外部站点。
  • 适用范围:较轻量级的场景,防止未经认证的跨站请求。

3. 验证Referer和Origin

  • 对于一些简单场景,可以在服务器端检查Referer和Origin头部,以确保请求来自合法的站点。
  • 适用范围:非敏感的、依赖浏览器的操作场景(可以作为辅助手段)。

4. 多因素认证

  • 针对特别敏感的操作,如账户资金转移或密码修改,建议在执行操作前增加MFA(多因素认证),如短信验证或二次密码确认。
  • 适用范围:极为敏感的用户操作,特别是涉及资金或安全的功能。

实现方案

CSRF Token实现

Spring Security框架自带CSRF防护机制,默认保护所有需要修改数据的HTTP方法(POST、PUT、DELETE)。如果是REST API,可按如下方式进行配置:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 启用CSRF保护
        http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
        
        // 配置保护哪些请求
        http
            .authorizeRequests()
            .antMatchers("/sensitive-endpoints/**").authenticated()
            .anyRequest().permitAll();
    }
}
  • CookieCsrfTokenRepository.withHttpOnlyFalse()会将CSRF Token存储在Cookie中,并在客户端的表单中嵌入,防止跨站请求。

SameSite Cookie设置

可以在Spring Boot中设置SameSite属性来防御跨站请求:

@Bean
public ServletContextInitializer initializer() {
    return servletContext -> {
        SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig();
        sessionCookieConfig.setHttpOnly(true); // 防止XSS攻击
        sessionCookieConfig.setSecure(true); // 只允许HTTPS请求
        sessionCookieConfig.setSameSite("Lax"); // 设置SameSite属性
    };
}
  • 这里配置了SameSite=Lax,确保敏感的POST请求不会被跨站发送。

Referer和Origin头验证

对某些关键操作(如密码修改),可以手动添加对请求头的验证:

@RequestMapping(value = "/change-password", method = RequestMethod.POST)
public ResponseEntity<String> changePassword(HttpServletRequest request) {
    String referer = request.getHeader("Referer");
    String origin = request.getHeader("Origin");

    if (referer == null || !referer.startsWith("https://yourdomain.com")) {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Invalid referer");
    }
    
    if (origin == null || !origin.equals("https://yourdomain.com")) {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Invalid origin");
    }

    // 执行密码修改逻辑
    return ResponseEntity.ok("Password changed successfully");
}
  • 在此场景中,只有合法的Referer和Origin请求才会被接受。

多因素认证 (MFA)

针对特别敏感的操作,例如转账或修改密码,可以通过引入短信验证或Google Authenticator等方式实现多因素认证:

@RequestMapping(value = "/transfer", method = RequestMethod.POST)
public ResponseEntity<String> transfer(@RequestParam String token, HttpServletRequest request) {
    // 验证MFA Token
    boolean isValid = mfaService.verifyToken(token);

    if (!isValid) {
        return ResponseEntity.status(HttpStatus.FORBIDDEN).body("Invalid MFA token");
    }

    // 执行转账操作
    return ResponseEntity.ok("Transfer successful");
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL分类中的DQL

DQL&#xff08;Data Query Language&#xff09;:数据查询语言&#xff0c;用来查询数据库中表的记录。 一、DQL语法 编写顺序 执行顺序 SELECT 字段列表 5 FROM 表名列表 1 WHERE 条件列表 2 GROUP BY 分组字段列表 3 HAVING 分组后条件列表 4 ORDER BY 排…

Golang | Leetcode Golang题解之第470题用Rand7()实现Rand10()

题目&#xff1a; 题解&#xff1a; func rand10() int {for {a : rand7()b : rand7()idx : (a-1)*7 bif idx < 40 {return 1 (idx-1)%10}a idx - 40b rand7()// get uniform dist from 1 - 63idx (a-1)*7 bif idx < 60 {return 1 (idx-1)%10}a idx - 60b rand…

Mac 电脑安装redis

1、首先检查电脑是否安装 brew 命令&#xff1a; #打开Mac自带的终端&#xff0c;输入下面命令 brew --version如下图&#xff0c;可以看到我的 brew 正常的&#xff0c;且对应版本是4.0.17-63-g32f2258 如果你的电脑执行上面命名报错&#xff1a;zsh: command not found: br…

gbase8s之建表相关问题

第一章..绪论 1.1..背景 需要对明年所有系统的表新建。 1.2..要求 对导切建表可能遇到的一些问题罗列及解决办法。 第二章..新建表的的过程 1.1..获取DDL 获取DDL一定要在服务器上去获取&#xff0c;千万别用gds去导出ddl。 1.1.1..切换数据库用户 su – gbasedbt 1.1…

HTTP vs WebSocket

本文将对比介绍HTTP 和 WebSocket &#xff01; 相关文章&#xff1a; 1.HTTP 详解 2.WebSocket 详解 一、HTTP&#xff1a;请求/响应的主流协议 HTTP&#xff08;超文本传输协议&#xff09;是用于发送和接收网页数据的标准协议。它最早于1991年由Tim Berners-Lee提出来&…

如何查看GB28181流媒体平台LiveGBS中对GB28181实时视频数据统计的负载信息

目录 1、负载信息2、负载信息说明3、会话列表查看 3.1、会话列表4、停止会话5、搭建GB28181视频直播平台 1、负载信息 实时展示直播、回放、播放、录像、H265、级联等使用数目 2、负载信息说明 直播&#xff1a;当前推流到平台的实时视频数目回放&#xff1a;当前推流到平台的回…

OpenAI Canvas最新发布,编程和写作迎来全新史诗级加强!

文章目录 零、前言一、GPT-40 with canvas操作指导写作领域加强建议编辑调整长度阅读水平添加最后的润色添加表情 编程领域加强选中代码问问题添加评论&#xff08;添加注释&#xff09;添加日志转换语言代码审查 二、感受 零、前言 最新消息&#xff0c;国庆期间OpenAI有大动…

解放双手-Mac电脑自定义文件默认打开方式的最有效方法

你们使用Mac的过程中&#xff0c;文件格式是不是每次都要自己选择打开方式&#xff0c;文件类型太多了&#xff0c;默认打开方式没办法兼顾所有的文件类型&#xff0c;这样太麻烦了&#xff0c;如果收到了新文件类型的文件&#xff0c;每次都要弹窗选择打开方式会不会心累 试试…

QT工程概述

在Qt中&#xff0c;创建 "MainWindow" 与 "Widget" 项目的主要区别在于他们的用途和功能范围&#xff1a; MainWindow&#xff1a;这是一个包含完整菜单栏、工具栏和状态栏的主窗口应用程序框架。它适合于更复 杂的应用程序&#xff0c;需要这些额外的用户…

git删除错误的commit

文章目录 1、git删除错误的commit2、.gitignore配置文件不生效的问题 1、git删除错误的commit git的流程如图&#xff1a; 当某次失误造成commit的版本有问题&#xff0c;需要回退到正常的版本修改后重新add。 首先通过git log查看commit提交记录&#xff0c;可以看到HEAD-…

使用Pytorch写简单线性回归

文章目录 Pytorch一、Pytorch 介绍二、概念三、应用于简单线性回归 1.代码框架2.引用3.继续模型(1)要定义一个模型&#xff0c;需要继承nn.Module&#xff1a;(2)如果函数的参数不具体指定&#xff0c;那么就需要在__init__函数中添加未指定的变量&#xff1a; 2.定义数据3.实例…

Redis哨兵模式部署(超详细)

哨兵模式特点 主从模式的弊端就是不具备高可用性&#xff0c;当master挂掉以后&#xff0c;Redis将不能再对外提供写入操作&#xff0c;因此sentinel模式应运而生。sentinel中文含义为哨兵&#xff0c;顾名思义&#xff0c;它的作用就是监控redis集群的运行状况&#xff0c;此…

如何利用phpstudy创建mysql数据库

phpStudy诞生于2007年&#xff0c;是一款老牌知名的PHP开发集成环境工具&#xff0c;产品历经多次迭代升级&#xff0c;目前有phpStudy经典版、phpStudy V8&#xff08;2019版&#xff09;等等&#xff0c;利用phpstudy可以快速搭建一个mysql环境&#xff0c;接下来我们就开始吧…

Unity MVC框架1-2 实战分析

该课程资源来源于唐老狮&#xff0c;吃水不忘打井人&#xff0c;不胜感激 Unity MVC框架演示 1-1 理论分析-CSDN博客 首先你需要知道什么mvc框架&#xff0c;并且对三个层级有个比较清晰的认识&#xff0c;当然不清楚也好&#xff0c;下面例子中将会十分细心地让你理解&#x…

SpringBoot在高校竞赛平台开发中的优化策略

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理高校学科竞赛平台的相关信息成为必然。开发…

TensorFlow详细配置

Anaconda 的安装路径配置系统环境变量 1 windows path配置 2 conda info C:\Users\Administrator>conda info active environment : None user config file : C:\Users\Administrator\.condarc populated config files : C:\Users\Administrator\.condarc …

Vue3中常用的八种组件通信方式

一、props父组件向子组件通信 父组件&#xff1a; props用于父组件向子组件传递数据&#xff0c;子组件用defineprops接收父组件传来的参数 在父组件中使用子组件时&#xff0c;给子组件以添加属性的方式传值 <sonCom car"宝马车"></sonCom> 其中如…

如何在 Jupyter Notebook 执行和学习 SQL 语句(上)—— 基本原理详解和相关库安装篇

近期我找工作很多岗位问到sql&#xff0c;由于我简历上有写&#xff0c;加上我实习的时候确实运用了&#xff0c;所以我还是准备复习一下SQL语句&#xff0c;常见的内容&#xff0c;主要包括一些内容&#xff0c;比如SQL基础&#xff08;主要是取数select&#xff0c;毕竟用的时…

electron-vite打包踩坑记录

electron-vite打包踩坑记录 大前端已成趋势&#xff0c;用electron开发桌面端应用越来越普遍 近期尝试用electronvite开发了个桌面应用&#xff0c;electron-vite地址&#xff0c;可用使用vue开发&#xff0c;vite打包&#xff0c;这样就很方便了 但是&#xff0c;我尝试了一…

Java项目实战II基于Java+Spring Boot+MySQL的桂林旅游景点导游平台(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 桂林&#xff0c;以其独特的喀斯特地貌、秀美的自然风光闻名遐迩&#xff0c;每年吸引着无数国内外游…