CSRF 概念及防护机制

news2024/11/15 12:39:57

概述

CSRF(Cross-Site Request Forgery),即跨站请求伪造,是一种网络攻击方式。在这种攻击中,恶意用户诱导受害者在不知情的情况下执行某些操作,通常是利用受害者已经登录的身份,向受害者信任的网站发出恶意请求

原理分析

从概述中划重点:利用受害者已经登陆的身份(如登陆态、浏览器中的Cookie等),向受害者已登陆的网站发出恶意请求
举例:
假设用户 A 已经登陆到某银行网站bank.com ,并且恶意用户 B 创建了一个恶意网站evil.com。当用户 A 访问evil.com时,该网站发起了一个请求,类似于以下的内容:

<!-- 假设 bank.com 的 /transfer 接口是转账接口,amout 是转账金额,to_account 是转账对象的账户 -->
<img src="http://bank.com/transfer?amount=1000&to_account=B" />

那么因为用户 A 已经登陆了bank.com ,那么在发起这个请求的时候,浏览器就会自动携带用户 A 的登陆Cookie去调用这个接口;从bank.com的服务端来看,这个请求已经携带了用户 A 的Cookie,是一个合法请求,那么就会正常执行这个(转账)请求;最终(1000块)钱就从用户 A 转到了用户 B 的账户。这就是典型的CSRF攻击。

上面的例子比较夸张(实际上银行系统的防御能力堪称全方位无死角,所以大家也不用担心这种问题会实际发生),但是CSRF攻击的原理就是这样。

问题的关键

从上面的例子来看,问题出现的点在于:

  1. 当用户使用浏览器在evil.com的网页上请求bank.com的接口时,浏览器自动带上了bank.comCookie
  2. bank.com没有校验请求来源是否是受信任的网页。

所以对应的,如果可以解决这两个问题,那么CSRF问题自然就解决了。

解决问题的办法

分别从浏览器端和服务器端来解析一些解决CSRF问题的机制。

浏览器端

SameSite Cookie 属性

在服务器返回Cookie给浏览器时,可以在Set-Cookie响应头中添加SameSite属性,后续浏览器将会按照SameSite的值来决定什么情况下允许跨站请求携带该Cookie,例如:
在这里插入图片描述

SameSite属性有三种取值:

  • SameSite=Strict:浏览器仅在同源请求中携带该Cookie,跨站请求(如从evil.com发起的对bank.com的请求)不会附带该Cookie
  • SameSite=Lax:允许某些跨站请求(如 GET 请求)携带 Cookie,但不会在 POST 等修改数据的请求中携带。
  • SameSite=None:允许所有跨站请求携带 Cookie(这也需要设置 Secure 属性,确保只通过 HTTPS 传输)。

再代入到之前讲过的例子中,在evil.com网页中请求bank.com的接口时,如果设置了SameSite=Strict,那么浏览器在执行该请求时将不会自动带上bank.comCookie,这样在一定程度上就能防止CSRF攻击。

响应头 Referrer Policy 和请求头 Referer 属性

在讲Referrer Policy之前,先讲一下请求头中的Referer属性。

Referer的字面意思是引用者的意思,在请求头中,它描述了当前请求是从哪个具体页面跳转过来的。在浏览器环境下,Referer属性是在浏览器发起请求时由浏览器自动设置的,通常情况下网页中的脚本是无法手动指定或更改的。

例如,你在银行网站的bank.com/user/123(假设123是你在银行系统内的用户ID ),那么从这个界面跳转到evil.com 的界面时(只是举例说明,尽管从银行系统跳转到一个恶意网站基本是不可能的事情),默认情况下这个跳转请求的请求头上将会添加Referer=bank.com/user/123 ,用来告诉evil.com请求是从bank.com/user/123 界面跳转过来的。

在这个例子中,evil.com很有可能从Referer=bank.com/user/123中拿到你在银行系统的用户ID123 ,你的用户信息就被泄露了,你账户中的钱就多了一分被窃取的可能。


Referrer Policy是由服务端通过HTTP响应头或HTML <meta>标签设置的,用于控制浏览器在发起请求时是否以及如何发送Referer头。它可以限制浏览器在跨站请求中暴露的来源信息,可以保护用户隐私。
服务器可以在请求响应头中设置Referrer Policy的值,例如:

Referrer-Policy: no-referrer

或者通过网页中的<meta>标签设置,例如:

<meta name="referrer" content="no-referrer">

根据 Referrer-Policy 的值,浏览器会在后续请求中控制 Referer 请求头的发送。Referrer-Policy 属性有四种取值:

  • no-referrer :不发送 Referer 头。
  • no-referrer-when-downgrade:默认值,在 HTTPS 页面发起 HTTP 请求时不发送 Referer,其他情况下发送完整的 Referer
  • origin :只发送来源站点的根 URL,不包含具体路径。
  • strict-origin-when-cross-origin :同源请求发送完整的 Referer,跨站请求只发送源站点的根 URL

在上面讲的例子中,如果我们设置了Referrer-Policy: no-referrer ,那么从bank.com 跳转到evil.com的时候,就不会在请求头中添加关于你用户信息相关的内容,你的信息就不会泄漏,这样也能减少你被CSRF攻击的可能。

Access-Control-Allow-* 系列响应头属性

Access-Control-Allow-* 是一系列由服务端返回的响应头属性,主要包括:

  • Access-Control-Allow-Origin :指定哪些域名(来源)被允许访问其资源。
  • Access-Control-Allow-Methods :指定允许的 HTTP 方法,如 GETPOSTPUT 等。
  • Access-Control-Allow-Header :指定允许的自定义请求头,如 Content-TypeAuthorization 等。
  • Access-Control-Allow-Credentials:指定是否允许发送 Cookie和其他凭据。如果设置为 true,则表示允许。
  • Access-Control-Expose-Headers:指定哪些响应头可以被浏览器访问(即哪些头是可以暴露给前端 JavaScript 代码的)。

与跨域访问最相关的就是Access-Control-Allow-Origin。例如,bank.com 的服务器可以在响应头中添加Access-Control-Allow-Origin=bank.com来限制只有来自于这个域名的请求才允许发起访问,这种情况下,evil.com自然也没有办法发起对于bank.com的请求了。其他几个响应头都可以针对浏览器发起的请求行为进行不同维度的限制,在一定程度上也可以防止CSRF攻击。

服务器端

检查请求头 Origin 属性

Origin的字面意思是起源的意思,在请求头中,它描述的是请求发起的源站点,包括协议、域名、和端口,但不包括具体的路径。
Referer 相比,Origin 更关注大范围的来源,即请求是从哪个站点发起的(比如是从 https://www.example.com 还是从 http://another.com 发起的),而不在意具体的页面路径。Origin请求头通常用于跨站请求或安全相关的场景。比如,当你发送跨域请求时,浏览器会自动附加 Origin 头,告诉目标服务器请求的发起源,以便服务器决定是否允许请求。

Referer属性类似,在浏览器环境下,Origin属性是在浏览器发起请求时由浏览器自动设置的,通常情况下网页中的脚本是无法手动指定或更改的。
例如,当你在evil.com 网页被诱导向bank.com 发送请求时,请求头上将会自动添加Origin=evil.com ,银行的服务器接收到请求后,通过查看Origin 属性,就可以知道这个请求发起自evil.com 而不是bank.com

所以在服务器接收到请求后,可以检查请求头中的Origin 属性,判断请求是否来源于受信任的网页,如果不是受信任的网页,就可以丢弃该请求不作处理。

使用验证码

经过上面的分析,我们已经知道了CSRF攻击有一个重要的前提就是在用户不知情的情况下自动请求目标系统,所以如果我们能在重要的接口操作前,通过验证码验证用户真实身份,确保用户知晓接下来的操作行为,也可以防止CSRF攻击。

使用 CSRF Token

在用户访问并登陆一个网站(例如bank.com)之后,服务器会生成一个唯一的CSRF Token ,并将其发送给客户端。后续使用该用户的身份信息进行访问的接口都需要客户端在请求中添加该Token ,服务端也会校验该Token ,用来确保用户的真实身份。

注意,这个Token 在浏览器中的的存放位置,与服务端交互时的使用规则(该Token是放在请求头还是请求体中,参数的具体名称,是否需要根据当前时间戳再次生成)每个网站都可能是不同的,所以使用CSRF Token 可以在较大程度上防止CSRF攻击。

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

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

相关文章

我是如何在一分钟之内,不用多次交互AI,就完成了指定任务

本文背景 为什么我的AI不听话&#xff1f; 为什么我用AI写知乎文、视频文案、豆瓣影评、工作日报、论文、商业策划案、标书、代码都一直得不到想要的效果&#xff1f; 为什么我的AI生成的都是没有价值的口水文&#xff1f; 大象经过大量的AI实战经验&#xff0c;给出了这些问题…

ESP32-C3在MQTT访问时出现“Last error code reported from esp-tls: 0x8001”和问题的分析(3)

接前一篇文章:ESP32-C3在MQTT访问时出现“Last error code reported from esp-tls: 0x8001”和问题的分析(2) 上一回讲解了所遇问题log中的“esp-tls: couldnt get hostname for :iot-emqx-pre.nanshe-tech.com: getaddrinfo() returns 202, addrinfo=0x0”,再来回顾一下。…

USB:物理接口

USB&#xff1a;物理接口 物理接口 从高级概述角度来看&#xff0c;USB 的物理接口具有两个组件&#xff1a;线缆和连接器。这些连接器将设备连接到主机上。 一个 USB 线缆包含由一个绝缘套保护的多个组件。该绝缘套下面是一个包含了一个带有铜面的外部扩展板。 外部扩展板内包…

为什么现在人工智能大部分都用python而不是其他软件呢?

大部分人都选择使用Python而不是其他软件&#xff0c;主要是因为Python具有多方面的优势&#xff0c;这些优势使其在众多编程语言中脱颖而出&#xff0c;成为许多领域&#xff0c;特别是IT和人工智能领域的首选。以下是几个主要原因&#xff1a; 1. 简单易学 Python的语法简洁…

PMP备考3A的心得分享

首先&#xff0c;每一位报考的都会收到一份学习计划表&#xff0c;一定要仔细阅读这张表&#xff0c;并与自己的时间结合起来&#xff0c;看是否会有很大的冲突&#xff0c;如果有&#xff0c;那么可以找老师帮忙解决。一般来说&#xff0c;学习计划表的时间安排是非常恰当的&a…

下载淘宝的短视频(通过第三方插件)

目录&#xff1a; 1、通过插件插件下载短视频 1&#xff09;获取“Microsoft Edge扩展” 2&#xff09;搜索“aix智能下载器” 3&#xff09;将插件钉在浏览器上 4&#xff09;嗅控并下载视频 2、从其他来源安装插件 1、通过插件插件下载短视频 1&#xff09;获取“M…

(二)Kafka离线安装 - Zookeeper下载及安装

一、下载 下载ZooKeeper之前&#xff0c;需要根据下载的Kafka版本&#xff0c;来确定ZooKeeper的版本。 Kafka官方地址&#xff1a;Apache Kafka 1、先下载源码版本&#xff0c;下载完后解压&#xff0c;在kafka-3.8.0-src\gradle目录下找到dependencies.gradle文件&#xff…

从 0 到 1 的Prompt 教程,来自Claude 官方,不会写 prompt的看这个足够

Claude 的强大&#xff0c;最近得到了很多网友的验证&#xff0c;甚至效果上面大有超越 GPT的许多声音。 所以从优秀的 Claude 中学习&#xff0c;将会是一个很好的起点。 这里&#xff0c;Claude 的开发者们提供了一个相当详细的 Prompt Engineering 教程。 这个教程能够全面…

USB3.2 摘录(13)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; USB3.2 摘录&#xff08;五&#xff09; USB3.2 摘录&#xff08;六&#xff09; USB3.2 摘录&…

SpringBoot JPA 语法大全

Keyword:为关键词 Sample:为直接用在方法名上的例子 JPQLsnipper:为JPQL,Query的写法的例子

redhat7.9安装zsh以及常用插件

1 安装zsh并更改默认终端 #1.安装软件包 yum -y install zsh git#2.更改默认终端 chsh -s /bin/zsh然后再退出下终端&#xff0c;重新登录用echo $SHELL 查看环境是否是/bin/zsh 2 配置oh-my-zsh #1.从git仓库中拉取oh-my-zsh git clone https://gitee.com/mirrors/oh-my-z…

【私有云场景案例分享②】批量装包与冒烟测试的自动化实现

一、前言 在软件开发和测试过程中&#xff0c;批量装包和冒烟测试是两个关键环节。随着项目规模的扩大和测试需求的增加&#xff0c;传统的手动操作方式已经无法满足效率和质量的要求。通过AirtestIDE企业版与DeviceKeeper结合的批量装包和冒烟测试解决方案&#xff0c;可以提…

【科研新手】如何判断自己找到的创新点是否已被发表呢?

很多人在自己的实验结果出来后再开始写论文&#xff0c;才发现自己的论文创新点已经被他人抢先发表了&#xff0c;因此我们需要做好预防措施&#xff0c;那么如何判断自己所找到的创新点是否已被发表了呢。 1、在纬度学术检索最新的文献并下载 2、将文献投喂到Kimi智能助手&am…

IOS逆向助手-无需越狱就能逆向IOS软件的强大工具

前言 晓杰自己就是JAVA开发程序员&#xff0c;工作之余也会学习下逆向&#xff0c;研究一下各个软件的漏洞用于提交漏洞赚取微薄的漏洞奖励来补贴家用&#xff0c;下面晓杰就将自用的IOS逆向助手分享给大家&#xff01; 软件简介 IOS逆向助手支持越狱和未越狱设备安装&#…

储能电池仓电池热失控监测系统技术分析

在当今能源转型的大背景下&#xff0c;储能技术的发展至关重要。而储能电池仓作为储能系统的核心组成部分&#xff0c;其安全性问题备受关注。电池热失控是储能电池仓面临的重大风险之一&#xff0c;一旦电池发生热失控&#xff0c;可能引发火灾、爆炸等严重后果。为了有效防范…

2024洗衣机选择(个人笔录)

总结 比较 说明&#xff1a;素材引自小红书博主郎朗Waves

【ceph学习】S3权限认证部分

认证过程简介 认证的过程是一个对用户信息进行解析并且判断前后得到的秘钥是否一致的过程。 auth_regitry的创建 在rgw_main.cc:main()中进行初始化auth_registry对象 /*rgw_main.cc*/ /* Initialize the registry of auth strategies which will coordinate * the dynamic…

哪款伴奏提取免费软件比较好?音乐制作利器快速分离人声与伴奏

无论是在健身房挥汗如雨&#xff0c;还是在家中享受宁静的夜晚&#xff0c;一首美妙的旋律总能让人心旷神怡。但大家是否想过&#xff0c;那些动人心弦的伴奏是如何从混音中被抽离出来的呢&#xff1f; 作为一个音乐爱好者&#xff0c;我发现了5款“伴奏提取器在线”神奇工具&…

室内蓝牙导航定位技术应用优势

在错综复杂的室内环境中&#xff0c;精准导航一直是用户与管理者共同面临的难题。随着科技的进步&#xff0c;室内蓝牙导航定位技术应运而生&#xff0c;以其独特的优势正逐步改变这一现状。本文就由沧穹给大家具体介绍一下室内蓝牙导航定位技术应用优势。 首先&#xff0c;蓝牙…

[VG] TransVG++

1. BaseInfo TitleTransVG: End-to-End Visual Grounding with Language Conditioned Vision TransformerAdresshttps://arxiv.org/pdf/2206.06619Journal/Time202206 IEEE TPAMIAuthor中科大Codehttps://github.com/djiajunustc/TransVGRead20240717/ 0829TableVisonLanguage…