CSRF(跨站请求伪造)深度解析

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
💬 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

一、定义与原理

  1. 概念
    • CSRF(Cross - Site Request Forgery),即跨站请求伪造,是一种网络安全攻击方式。攻击者利用用户在目标网站的登录状态,通过诱使受害者访问恶意页面或者点击恶意链接,在受害者不知情的情况下,让受害者的浏览器向目标网站发送请求,这些请求可能会执行一些对攻击者有利但对用户有害的操作,如修改用户信息、进行转账等。
  2. 攻击原理
    • 大多数网站在用户登录后会建立一个会话(Session),并通过Cookie或者其他方式来识别用户身份。当用户访问一个被攻击者控制的恶意页面时,这个页面中的恶意脚本可以构造一个请求,该请求会自动携带用户浏览器中的目标网站的身份识别信息(如Cookie),并将请求发送到目标网站。由于目标网站无法区分这个请求是用户正常操作还是被伪造的请求,就可能会执行这个请求中的操作。

二、CSRF攻击的类型

(一)GET类型CSRF

  1. 原理与过程
    • GET类型的CSRF攻击主要利用了HTML中<img><a>等标签可以自动发送GET请求的特性。攻击者在恶意页面中嵌入一个<img>标签,其src属性指向目标网站的一个会产生副作用的URL(如修改密码的URL)。当受害者的浏览器加载这个恶意页面时,会自动发送这个GET请求,从而可能导致目标网站执行相应的操作。
    • 例如,目标网站有一个修改用户密码的接口http://example.com/change - password?newpassword = 123456,攻击者在恶意页面中插入<img src="http://example.com/change - password?newpassword = 123456" alt=""/>。当用户访问这个恶意页面时,浏览器会自动发送一个修改密码的GET请求,而用户可能完全不知情。
  2. 攻击场景与影响
    • GET类型的CSRF攻击相对比较容易被发现,因为它通常会在浏览器的历史记录或者服务器日志中留下痕迹。但是,如果目标网站没有对敏感操作进行适当的保护,这种攻击仍然可能会导致用户信息泄露或者数据被篡改。这种攻击在一些旧的或者安全性较低的网站中比较常见。

(二)POST类型CSRF

  1. 原理与过程
    • POST类型的CSRF攻击通常需要借助JavaScript来构造一个伪造的表单并自动提交。攻击者在恶意页面中创建一个包含目标网站操作的表单,如转账表单,然后通过JavaScript自动提交这个表单。当受害者访问恶意页面时,浏览器会在用户不知情的情况下发送这个POST请求,就好像用户自己在目标网站上执行了这个操作一样。
    • 例如,攻击者在恶意页面中添加以下代码:
    <form id="csrf - form" action="http://example.com/transfer - money" method="POST"><input type="hidden" name="amount" value="10000" /><input type="hidden" name="recipient" value="attacker - account" />
    </form>
    <script>document.getElementById('csrf - form').submit();</script>
    
    • 当用户访问这个恶意页面时,会自动向目标网站发送一个转账10000元到攻击者账户的POST请求。
  2. 攻击场景与影响
    • POST类型的CSRF攻击比GET类型更具隐蔽性,因为POST请求通常用于提交表单等操作,在服务器日志中看起来可能更像是用户的正常操作。这种攻击可能会导致严重的经济损失或者数据泄露,尤其是在涉及金融交易或者敏感信息修改的网站上。

三、防范措施

(一)验证请求来源(Same - Origin Policy)

  1. 同源策略原理

    • 浏览器的同源策略是一种重要的安全机制。它规定,只有当两个页面的协议、域名和端口都相同(即同源)时,一个页面中的脚本才能访问另一个页面的资源。在防范CSRF攻击时,可以利用同源策略来验证请求是否来自合法的来源。
    • 例如,如果一个请求是从与目标网站不同源的页面发出的,浏览器会阻止这个请求访问目标网站的敏感资源,除非目标网站明确允许跨源访问(通过CORS等机制)。
  2. 验证方法与局限性

    • 可以通过检查请求头中的Referer(注意拼写是Referer,不是Reference)或者Origin字段来验证请求的来源。Referer字段包含了请求的来源页面的URL,Origin字段只包含了来源的协议、域名和端口。
    • 然而,这些方法都有一定的局限性。Referer字段可能会被浏览器或者用户代理(User - Agent)修改或者隐藏,Origin字段在一些跨域场景下可能不存在或者不准确。并且,一些较老的浏览器可能不支持这些字段的验证。

(二)使用CSRF令牌(Token)

  1. 令牌生成与存储
    • CSRF令牌是一种防范CSRF攻击的有效方法。网站在生成页面时,会为每个用户会话或者每个重要的表单生成一个唯一的令牌(Token),并将这个令牌存储在用户的会话(如服务器端的Session)中,同时将令牌以隐藏表单元素或者请求头的方式发送给用户浏览器。
    • 例如,在一个使用Python的Django框架的网站中,当生成一个表单时,可以使用Django的内置功能来生成和存储CSRF令牌:
    from django.shortcuts import render
    from django.views.decorators.csrf import csrf_protect@csrf_protect
    def my_view(request):if request.method == 'POST':# 验证CSRF令牌if request.POST.get('csrfmiddlewaretoken') == request.session.get('csrfmiddlewaretoken'):# 执行正常的表单操作passelse:request.session['csrfmiddlewaretoken'] = generate_csrf_token()return render(request, 'my - template.html')
    
  2. 令牌验证过程
    • 当用户提交表单或者发送请求时,网站会验证请求中携带的CSRF令牌是否与存储在用户会话中的令牌一致。如果令牌不一致或者不存在,就拒绝这个请求,认为可能是一个CSRF攻击。这种方法可以有效地防止攻击者伪造请求,因为攻击者很难获取到合法的CSRF令牌。

(三)设置合适的安全策略和HTTP头

  1. Same - Site Cookie属性
    • 可以通过设置Cookie的Same - Site属性来增强对CSRF攻击的防范。Same - Site属性有三个值:StrictLaxNone
    • Strict:当设置为Strict时,浏览器只会在请求来自与设置Cookie的网站完全相同的网站(同源)时,才会发送这个Cookie。这可以有效地防止CSRF攻击,但可能会对一些合法的跨站操作(如通过链接从其他网站跳转到目标网站)产生影响。
    • LaxLax是一种相对宽松的设置。在大多数情况下,浏览器会在安全的跨站请求(如通过<a>标签导航到目标网站)中发送Cookie,但在一些可能会导致CSRF攻击的情况下(如自动发送的GET请求)不会发送Cookie。
    • None:设置为None时,浏览器会在所有跨站请求中发送Cookie,这是最不安全的设置,通常需要与Secure属性一起使用,并且要求网站通过HTTPS访问。
  2. X - Frame - Options头
    • X - Frame - Options是一个HTTP头,用于控制网站是否可以被其他网站通过<iframe>等方式嵌入。设置这个头可以防止攻击者通过将目标网站嵌入到恶意页面中来进行CSRF攻击或者其他攻击(如点击劫持)。例如,设置X - Frame - Options: DENY,表示禁止任何网站通过<iframe>嵌入本网站。

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

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

相关文章

5、docker-compose和docker-harbor

安装部署docker-compose 自动编排工具&#xff0c;可以根据dockerfile自动化的部署docker容器。是yaml文件格式&#xff0c;注意缩进。 1、安装docker-compose 2、配置compose配置文件docker-compose.yml 3、运行docker-compose.yml -f&#xff1a;指定文件&#xff0c;up&…

QNAP 上常用的几款软件

当我们谈到 NAS&#xff08;Network Attached Storage&#xff09;时&#xff0c;QNAP 凭借多年的产品迭代、稳定的硬件性能和不断丰富的软件生态&#xff0c;已成为很多家庭及中小型企业的首选。除了存储本身&#xff0c;QNAP 提供的各种官方软件和应用&#xff0c;也为用户带…

Jmeter进行http接口并发测试

目录&#xff1a; 1、Jmeter设置&#xff08;1&#xff09;设置请求并发数&#xff08;2&#xff09;设置请求地址以及参数&#xff08;3&#xff09;添加结果数 2、启动看结果 1、Jmeter设置 &#xff08;1&#xff09;设置请求并发数 &#xff08;2&#xff09;设置请求地址…

9,STL——vector类

一、vector类的介绍和使用 1&#xff0c;了解vector vector类的官方介绍https://cplusplus.com/reference/vector/vector/ 使用STL的三个境界&#xff1a;能用&#xff0c;明理&#xff0c;能扩展 1). vector是表示可变大小数组的序列容器。 2). 就像数组一样&#xff0c;…

基于考研概率论知识解读 Transformer:为何自注意力机制要除以根号 dk

Transformer自注意力机制中除以 d k \sqrt{d_k} dk​ ​深度剖析 【 Transformer 系列&#xff0c;故事从 d k \sqrt{d_k} dk​ ​说起】 LLM这么火&#xff0c;Transformer厥功甚伟&#xff0c;某天心血来潮~&#xff0c;再去看看&#xff01; 它长这个样子&#xff1a; 深入…

Kafka权威指南(第2版)读书笔记

目录 Kafka生产者——向Kafka写入数据生产者概览创建Kafka生产者bootstrap.serverskey.serializervalue.serializer 发送消息到Kafka同步发送消息 Kafka生产者——向Kafka写入数据 不管是把Kafka作为消息队列、消息总线还是数据存储平台&#xff0c;总是需要一个可以往Kafka写…

python识别图片中指定颜色的图案并保存为图片

示例代码&#xff1a; def chuli(color):import cv2import numpy as np# 定义颜色名称到HSV阈值范围的映射color_thresholds {red: ([0, 100, 100], [10, 255, 255], [160, 100, 100], [180, 255, 255]),yellow: ([20, 100, 100], [30, 255, 255]),blue: ([90, 100, 100], [1…

golang 环境变量配置

一、GoLand显示环境如下 修改环境变量 新建系统变量 GOROOT&#xff1a; D:\ENSPACE\golandsdk\1.23.1\go1.23.1新建系统变量 GOPATH&#xff1a;工作目录&#xff08;在下面目录下新建目录&#xff1a;src,项目工程目录都要建在src下如&#xff1a;demo1 demo2&#xff09; D…

当自动包布机遇上Profinet转ModbusTCP网关,“妙啊”,工业智能“前景无限

在自动化控制技术日新月异的当下&#xff0c;Profinet与ModbusTCP这两种协议在工业通信领域占据着举足轻重的地位。ModbusTCP是基于以太网的串行通信协议&#xff0c;而Profinet则是依托工业以太网的现场总线协议。它们在数据传输速度、实时性表现以及兼容性等方面各具特色。不…

Redis的过期策略、内存淘汰机制

Redis只能存5G数据&#xff0c;可是你写了10G&#xff0c;那会删5G的数据。怎么删的&#xff1f;还有&#xff0c;你的数据已经设置了过期时间&#xff0c;但是时间到了&#xff0c;为什么内存占用率还是比较高? 一、Redis的过期策略 Redis采用的是定期删除惰性删除策略。 1…

一文通透OpenVLA及其源码剖析——基于Prismatic VLM(SigLIP、DinoV2、Llama 2)及离散化动作预测

前言 当对机器人动作策略的预测越来越成熟稳定之后(比如ACT、比如扩散策略diffusion policy)&#xff0c;为了让机器人可以拥有更好的泛化能力&#xff0c;比较典型的途径之一便是基于预训练过的大语言模型中的广泛知识&#xff0c;然后加一个policy head(当然&#xff0c;一开…

MySQL数据库(SQL分类)

SQL分类 分类全称解释DDLData Definition Language数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09;DMLData Manipulation Language数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQLData Query Languag…

word-break控制的几种容器换行行为详解

word-break 属性在控制换行行为时需要根据语言判断&#xff0c;对于中文 一个字符就是一个单词&#xff0c;字符换行不影响阅读理解&#xff0c;而对于英文来说&#xff0c;多个连续的字符才会是一个单词&#xff0c;例如中文的 早 英文为 morning。 morning7个字符才算一个单词…

国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)

参考文章&#xff1a;Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具&#xff0c;放到C盘根目录&#xff0c; 2.1 打开windows Powershell&#xff08;WinX&#xff09;&#xff0c;下边那个最好。 输入两条指令&a…

JVM虚拟机的组成 笼统理解 六大部分 类加载子系统 运行时数据区 执行引擎 本地接口 垃圾回收器 线程工具

目录 JVM虚拟机的组成&#xff1a;概述 JVM虚拟机的组成&#xff1a;详细解析 1. 类加载子系统 2. 运行时数据区 3. 执行引擎 4. 本地接口 5. 垃圾回收器 6. 线程管理与调试工具 概述 JVM&#xff08;Java Virtual Machine&#xff09;是一个虚拟计算机&#xff0c;执行…

2025 年 UI 大屏设计新风向

在科技日新月异的 2025 年&#xff0c;UI 大屏设计领域正经历着深刻的变革。随着技术的不断进步和用户需求的日益多样化&#xff0c;新的设计风向逐渐显现。了解并掌握这些趋势&#xff0c;对于设计师打造出更具吸引力和实用性的 UI 大屏作品至关重要。 一、沉浸式体验设计 如…

虚拟拨号技术(GOIP|VOIP)【基于IP的语音传输转换给不法分子的境外来电披上一层外衣】: Voice over Internet Protocol

文章目录 引言I 虚拟拨号技术(GOIP|VOIP)原理特性:隐蔽性和欺骗性II “GOIP”设备原理主要功能III 基于IP的语音传输 “VOIP” (Voice over Internet Protocol)IV “断卡行动”“断卡行动”目的电信运营商为打击电诈的工作V 知识扩展虚拟号保护隐私虚拟运营商被用于拨打骚扰…

算法-查找数组对角线上最大的质数

力扣题目&#xff1a;2614. 对角线上的质数 - 力扣&#xff08;LeetCode&#xff09; 给你一个下标从 0 开始的二维整数数组 nums 。 返回位于 nums 至少一条 对角线 上的最大 质数 。如果任一对角线上均不存在质数&#xff0c;返回 0 。 注意&#xff1a; 如果某个整数大于…

js:正则表达式

目录 正则表达式的语法 定义 检测 检索 元字符 边界符 量词 字符类 表单判断案例 修饰符 过滤敏感词 正则表达式是一种用于匹配和操作文本的强大工具&#xff0c;它是由一系列字符和特殊字符组成的模式&#xff0c;用于描述要匹配的文本字符组合模式 正则表达式是一…

Excel数据叠加生成新DataFrame:操作指南与案例

目录 一、准备工作 二、读取Excel文件 三、数据叠加 四、处理重复数据&#xff08;可选&#xff09; 五、保存新DataFrame到Excel文件 六、案例演示 七、注意事项 八、总结 在日常数据处理工作中&#xff0c;我们经常需要将不同Excel文档中的数据整合到一个新的DataFra…