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,一经查实,立即删除!

相关文章

七十五:握手的优化:Session缓存、Ticket票据及TLS 1.3的0-RTT

引言 在现代互联网环境中&#xff0c;安全性和性能是设计网络协议时至关重要的两个方面。传输层安全性&#xff08;TLS&#xff09;协议是实现安全传输的关键机制。然而&#xff0c;传统的TLS握手过程虽然安全&#xff0c;但是存在潜在的延迟问题。为了优化握手的效率&#xf…

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;设置请求地址…

PHP与HTML、CSS、JavaScript、jQuery的关系**

在当今数字化的Web开发领域&#xff0c;PHP与HTML、CSS、JavaScript、jQuery各自扮演着重要的角色&#xff0c;并且它们之间存在着紧密而复杂的关系。 一、HTML与PHP的关系 HTML&#xff08;超文本标记语言&#xff09;是构建网页内容结构的基础。它定义了网页中的各种元素&a…

[笔记] VS Code 完全指南:快捷键速查手册 与 Vue 开发插件推荐

文章目录 一. Vue 开发插件推荐二. 快捷键速查手册1. 基础操作2. 基础编辑 Basic editing3. 导航 Navigation4. 搜索和替换 Search and replace5. 多光标和选择 Multi-cursor and selection6. 丰富的语言编辑 Rich languages editing7. 编辑器管理 Editor management8. 文件管理…

永久免费不限速下载器支持市面上大部分BT链接

该款鲨鱼下载器目前是市面上免费下载&#xff0c;且不限速的下载器个别的链接无法识别 官方QQ群857577200 下载链接 官网

混币器是什么,波卡跨链交易平台

混币器是什么 混币器是一种加密货币工具,主要功能是将用户的加密货币与其他众多用户的加密货币混合在一起,打乱资金的流向和交易痕迹,使得加密货币的来源和去向难以追踪,从而增加交易的匿名性和隐私性。以下是对其工作流程和相关举例的介绍: 工作流程 用户首先将自己的加…

9,STL——vector类

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

【Vue】let、const、var的区别、适用场景

let、const、var&#xff0c;有哪些区别&#xff0c;适用场景 var 特点&#xff1a; var 是 JavaScript 中最传统的变量声明方式。具有函数作用域&#xff0c;即在函数内声明的 var 变量&#xff0c;在整个函数内都可以访问。变量提升&#xff1a;使用 var 声明的变量会被提升…

Android车机DIY开发之学习篇(二)编译Kernel以正点原子为例

Android车机DIY开发之学习篇(二)编译Kernel以正点原子为例 1.代码在/kernel-5.10文件夹下 2.在kernel-5.10目录下执行如下命令编译 &#xff1a; 编译之前&#xff0c;需要将 clang 导出到 PATH 环境变量&#xff1a; 如果是 Android12 执行下面这条命令 export PATH../pr…

QT3学习之qpainter学习

QImage img;QPixmap savedPixmap(sourceRect.size());QPainter savedPainter(&savedPixmap);// 使用 QPainter 从 bufferPixmap 复制指定区域savedPainter.drawPixmap(sourceRect,bufferPixmap);// 将 QPixmap 转换为 QImageQImage image savedPixmap.convertToImage();if…

web.xml常用配置

web.xml是Java Web应用程序的部署描述文件&#xff0c;它位于WEB-INF目录下。web.xml文件主要用于配置Servlet、Filter、Listener、MIME类型、欢迎页面等组件&#xff0c;以及一些Web应用的上下文参数。以下是一些常见的web.xml配置说明&#xff1a; Servlet配置&#xff1a; …

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

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

二进制、八进制、十进制和十六进制的相互转换

printf 函数 printf 函数是 C 语言中用于将格式化的数据输出到标准输出&#xff08;通常是屏幕&#xff09;的函数。它位于 stdio.h 头文件中&#xff0c;因此在使用之前需要包含该头文件。 printf 函数的格式说明符 格式说明符说明示例%d 或 %i输出或输入十进制有符号整数p…

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

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

类模板的使用方法

目录 类模板的使用方法 1.类模板语法 2.类模板和函数模板区别 3.类模板中成员函数创建时机 4.类函数对象做函数参数 5.类模板和继承 6.类模板成员函数类外实现 7.类模板分文件编写 person.hpp 实现cpp文件&#xff1a; 8.类模板与友元 9.类模板案例 MyArray.hpp …

Android SystemUI——使用Dagger2加载组件(四)

SystemUI 是 Android 系统中的一个重要模块,负责绘制系统栏(如状态栏、导航栏)、锁屏、快捷设置等用户界面元素。由于其复杂性,良好的架构设计和依赖管理对于保持代码的可维护性和扩展性至关重要。这就是 Dagger2 在此发挥重要作用的地方。 一、Dagger2介绍 Dagger2 是一个…

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…