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'):
                # 执行正常的表单操作
                pass
        else:
            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>嵌入本网站。

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

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

相关文章

详解如何自定义 Android Dex VMP 保护壳

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 Android Dex VMP&#xff08;Virtual Machine Protection&#xff0c;虚拟机保护&#xff09;壳是一种常见的应用保护技术&#xff0c;主要用于保护 And…

rabbitmqp安装延迟队列

在RabbitMQ中&#xff0c;延迟队列是一种特殊的队列类型。当消息被发送到此类队列后&#xff0c;不会立即投递给消费者&#xff0c;而是会等待预设的一段时间&#xff0c;待延迟期满后才进行投递。这种队列在多种场景下都极具价值&#xff0c;比如可用于处理需要在特定时间触发…

向量数据库如何助力Text2SQL处理高基数类别数据

01. 导语 Agent工作流和 LLMs &#xff08;大语言模型&#xff09;的出现&#xff0c;让我们能够以自然语言交互的模式执行复杂的SQL查询&#xff0c;并彻底改变Text2SQL系统的运行方式。其典型代表是如何处理High-Cardinality Categorical Data &#xff08;高基数类别数据&am…

Docker实践:部署Docker管理工具DockerUI

Docker实践&#xff1a;部署Docker管理工具DockerUI 前言一、DockerUI介绍1.1 DockerUI概述1.2 镜像说明 二、检查本地Docker环境三、拉取DockerUI镜像四、创建DockerUI容器五、访问DockerUI六、DockerUI的基本使用6.1 查询宿主机容器情况6.2 查询Docker镜像列表6.3 查看容器配…

【excel】VBA股票数据获取(搜狐股票)

文章目录 一、序二、excel 自动刷新股票数据三、付费获取 一、序 我其实不会 excel 的函数和 visual basic。因为都可以用matlab和python完成。 今天用了下VBA&#xff0c;还挺不错的。分享下。 上传写了个matlab获取股票数据的&#xff0c;是雅虎财经的。这次是搜狐股票的数…

解锁企业数据管理统一身份认证难题,EasyMR助力企业敏捷提效

在数字经济迅猛发展的当下&#xff0c;企业数据量正以令人惊叹的速度持续增长。据IDC研究显示&#xff0c;至2025年&#xff0c;全球数据总量预计将超175 ZB。数据的爆发式增长对企业而言&#xff0c;既是机遇&#xff0c;更是巨大挑战。 如今&#xff0c;大数据已然成为企业决…

IntelliJ IDEA Type Hierarchy Scope Pattern 学习指南

IntelliJ IDEA Type Hierarchy Scope Pattern 学习指南 什么是 Type Hierarchy&#xff1f; Type Hierarchy 是 IntelliJ IDEA 提供的一个工具&#xff0c;允许开发者查看某个类的继承关系及其实现的接口结构。它是理解类关系的重要工具&#xff0c;尤其在处理复杂的继承体系…

ukui-quick 计数器

作品简介 使用ukui-quick框架进行开发&#xff0c;实现了在任务栏中计数器的插件&#xff0c;方便用户的日常使用。 技术架构 用于实现一个具有点击计数功能的QML应用程序。这个架构将包括C后端和QML前端&#xff0c;通过Qt的信号和属性绑定机制进行交互。 实现过程 开发环…

Flutter:封装ActionSheet 操作菜单

演示效果图 action_sheet_util.dart import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:demo/common/index.dart;class ActionSheetUtil {/// 底部操作表/// [context] 上下文/// [title] 标题/// [items] 选项列表 …

【混合开发】CefSharp+Vue 解决Cookie问题

问题表现 使用Element-admin架构搭建Vue前端项目&#xff0c;在与CefSharp搭配时&#xff0c;出现无法使用cookie的问题。 无法将token存入cookiecookie无法被读取 如下图&#xff0c;Cookies下显示file://。 正常的Cookies显示&#xff0c;Cookies显示为http://域名&#x…

IIO(Industrial I/O)驱动介绍

文章目录 IIO&#xff08;Industrial I/O&#xff09;驱动是Linux内核中用于工业I/O设备的子系统&#xff0c;主要用于处理传感器数据采集和转换。以下是其关键点&#xff1a; 功能 数据采集&#xff1a;从传感器读取数据。数据处理&#xff1a;对原始数据进行滤波、校准等操作…

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色&#xff0c;我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的&#xff0c;这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…

C#轻松实现条形码二维码生成及识别

一、前言 大家好&#xff01;我是付工。 今天给大家分享一下&#xff0c;如何基于C#来生成并识别条形码或者二维码。 二、ZXing.Net 实现二维码生成的库有很多&#xff0c;我们这里采用的是http://ZXing.Net。 ZXing是一个开放源码的&#xff0c;用Java实现的多种格式的一…

一些常见的Java面试题及其答案

Java基础 1. Java中的基本数据类型有哪些&#xff1f; 答案&#xff1a;Java中的基本数据类型包括整数类型&#xff08;byte、short、int、long&#xff09;、浮点类型&#xff08;float、double&#xff09;、字符类型&#xff08;char&#xff09;和布尔类型&#xff08;boo…

PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统

基于深度学习YOLOv5神经网络水果蔬菜检测识别系统&#xff0c;其能识别的水果蔬菜有15种&#xff0c;# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

WPF、控件模板(ControlTemplate)和数据模板(DataTemplate)

前言 在 WPF 中&#xff0c;控件种类丰富且功能非常完善。一个显著的优点是 WPF 提供了强大的自定义能力和灵活的用户界面表现&#xff0c;能够满足各种复杂的应用需求。其中&#xff0c;ControlTemplate 和 DataTemplate 是两个非常重要的概念&#xff0c;分别用于自定义控件…

RAG实战_01代码生成_02智能检索

整理了RAG案例的Git代码 https://github.com/LGRY/RAG_Tutorial/tree/main 【注意事项】 01 代码生成系统源代码中使用的weaviate向量数据库&#xff0c;不支持window系统&#xff0c;建议换系统/换向量数据库02 智能检索系统 同样需要配置向量数据库&#xff0c;可以先安…

【Linux系统编程】—— 自动化构建工具Makefile指南

文章目录 背景基本使用推导过程适度扩展语法 背景 Makefile 是衡量开发者是否具备完成大型工程能力的一个重要标志。在一个工程中&#xff0c;源文件的数量可能极多&#xff0c;这些文件会按照类型、功能或模块分布在多个目录中。Makefile 通过定义一系列规则&#xff0c;指定…

【JavaWeb01】JavaWeb开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…