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

news2024/9/30 9:00:43

文章目录

  • 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");
}

在这里插入图片描述

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

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

相关文章

JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)

目录 Dialog对话框 介绍 使用 实际效果 Form表单 介绍 使用 实际效果 Dialog对话框 介绍 Dialog对话框&#xff1a;在保留当前页面状态的情况下&#xff0c;告知用户并承载相关操作。 Dialog 对话框组件可以在保留当前页面信息的状态下弹出一个对话框&#xff0c;并…

初始MYSQL数据库(8)—— JDBC编程

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 目录 JDBC的概念 JDBC的使用 加载驱动包 建立连接 创建 statement 对象 定义并执行SQL语句 处理结果集 关闭资源 SQL注入 …

taobao.item_get_appAPI接口原app数据测试指南

在电商竞争日益激烈的当下&#xff0c;数据成为了商家们争夺市场的重要武器。淘宝&#xff0c;作为中国最大的在线零售平台&#xff0c;其庞大的商品库和用户群体为商家提供了巨大的商机。为了帮助商家更好地了解市场动态&#xff0c;优化库存和营销策略&#xff0c;淘宝推出了…

详细分析CollUtil的基本知识(附Demo)

目录 前言1. 集合交并差2. CRUD3. 常用 前言 java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; CollUtil 是一个工具类&#xff0c;通常用于集合的操作&#xff0c;提供…

用友U8+CRM leadconversion.php SQL注入复现

0x01 产品描述&#xff1a; 用友U8-CRM是企业利用信息技术&#xff0c;是一项商业策略&#xff0c;它通过依据市场细分组织企业资源、培养以客户为中心的经营行为、执行以客户为中心的业务流程等手段来优化企业的客户满意度和获利能力。 0x02 漏洞描述&#xff1a; 用友 U8 CR…

<<迷雾>第5章 从逻辑学到逻辑电路(1)--继电器 示例电路

布尔代数可以用来解释复杂的开关电路 info::操作说明 鼠标单击开关切换开合状态 注: 开关不能全部都合上, 否则会导致模拟器异常 该异常与模拟器把开关和导线当作了零电阻的理想部件有关, 为避免此问题, 可在开关形成的回路上添加一个额外的电阻 另: 异常出现后, 右上方的运行按…

Nagle 算法:优化 TCP 网络中小数据包的传输

1. 前言 在网络通信中&#xff0c;TCP&#xff08;传输控制协议&#xff09;是最常用的协议之一&#xff0c;广泛应用于各种网络应用&#xff0c;如网页浏览、文件传输和在线游戏等。然而&#xff0c;随着互联网的普及&#xff0c;小数据包的频繁传输成为一个不容忽视的问题。…

行为设计模式 -策略设计模式- JAVA

策略设计模式 一 .简介二. 案例2.1 抽象策略&#xff08;Strategy&#xff09;类2.2 具体策略&#xff08;Concrete Strategy&#xff09;类2.3 环境&#xff08;Context&#xff09;类2.4 测试 三. 结论3.1 优缺点3.2 使用场景 前言 这是我在这个网站整理的笔记,有错误的地方请…

Git大框架总结

下面首先是我对于git的一个小总结&#xff0c;主要是大框架 首先是四区&#xff0c;因为大部分你所有的工作都是在这四个区里的实现的&#xff0c;包括要提交一个东西&#xff0c;是先是在工作区修改&#xff0c;后用add添加到暂存区&#xff0c;后提交到本地仓库&#xff0c;当…

文献阅读——电力系统安全域边界通用搜索模型与近似方法

文章标题 DOI&#xff1a;10.13334/j.0258-8013.pcsee.190884 ©2020 Chin.Soc.for Elec.Eng. 4411 文章编号&#xff1a;0258-8013 (2020) 14-4411-19 中图分类号&#xff1a;TM 74 电力系统安全域边界通用搜索模型与近似方法 姜涛&#xff0c;李晓辉&#xff0c;李雪*&a…

十五、存储过程与函数

文章目录 0. 引用1. 存储过程概述1.1 理解1.2 分类 2. 创建存储过程2.1 语法分析 3. 调用存储过程3.1 调用格式3.2 代码举例3.3 如何调试 4. 存储函数的使用4.1 语法分析4.2 调用存储函数4.3 代码举例4.4 对比存储函数和存储过程 5. 存储过程和函数的查看、修改、删除5.1 查看5…

建筑物变化检测算法baseline工程,开箱即用,23年5月测试准确度超越阿里云aiearth

建筑物变化检测算法baseline工程&#xff0c;开箱即用&#xff0c;23年5月测试准确度超越阿里云aiearth 建筑物变化检测算法Baseline工程 项目背景 随着城市化进程的加快&#xff0c;对建筑物的变化进行监测变得尤为重要。这不仅有助于城市管理与规划&#xff0c;还能够为灾害…

LeetCode 热题 100 回顾6

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

Kubernetes高级功能

资源配额 什么是资源配额 资源配额&#xff0c;通过 ResourceQuota 对象来定义&#xff0c;对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限&#xff0c;也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。 资源配额应用 创建的…

C语言中的日志机制:打造全面强大的日志系统

前言 在软件开发中&#xff0c;良好的日志记录机制对于调试、监控程序状态和维护系统的稳定性至关重要。本文将介绍如何在C语言中构建一个全面强大的日志系统&#xff0c;并提供一些示例代码。 1. 日志的基本概念 日志级别&#xff1a;用于分类日志信息的重要性&#xff0c;…

【Spring Boot 入门一】构建你的第一个Spring Boot应用

一、引言 在当今的软件开发领域&#xff0c;Java一直占据着重要的地位。而Spring Boot作为Spring框架的延伸&#xff0c;为Java开发者提供了一种更加便捷、高效的开发方式。它简化了Spring应用的搭建和配置过程&#xff0c;让开发者能够专注于业务逻辑的实现。无论是构建小型的…

齐次坐标的理解

齐次坐标是一种在计算机图形学、计算几何和机器人学中广泛使用的坐标表示方法。它通过引入额外的维度&#xff0c;将传统的欧几里得坐标转换为齐次坐标&#xff0c;从而简化一些数学运算&#xff0c;尤其是在变换&#xff08;如平移、旋转和缩放&#xff09;时。 齐次坐标的定…

基于SpringBoot实现QQ邮箱发送短信功能 | 免费短信服务

开发学习过程中有个短信发送功能&#xff0c;阿里云腾讯云等等都要money&#xff0c;听说qq邮箱可以实现免费发送邮箱的功能&#xff08;短信发送的平替&#xff09;&#xff0c;就用这个来实现&#xff01;&#xff01;&#xff01;【找了好多好多方法才成功的啊啊啊啊&#x…

【MySQL】查询原理 —— B+树查询数据全过程

使用B树作为索引结构的原因&#xff1a; 一种自平衡树&#xff1a; B树在插入和删除的时候节点会进行分裂和合并操作&#xff0c;以保持树的平衡&#xff0c;存在冗余节点&#xff0c;使得删除的时候树结构变化小&#xff0c;更高效。 高度不会增长过快&#xff0c;查询磁盘I…

[大语言模型-论文精读] 悉尼大学-ACL2024-提升大型语言模型的复杂视觉推理能力

[大语言模型-论文精读] 悉尼大学-ACL2024-提升大型语言模型的复杂视觉推理能力 目录 文章目录 [大语言模型-论文精读] 悉尼大学-ACL2024-提升大型语言模型的复杂视觉推理能力目录论文简介0. 摘要2. 相关工作2.1 视觉-语言领域的推理研究2.2 用于视觉-语言分析的大型语言模型 3 …