CSRF 概念及防护机制

news/2024/9/18 15:04:55/ 标签: csrf, web安全, 网络安全

概述

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.ppmy.cn/news/1517114.html

相关文章

【精选】基于数据可视化的智慧社区内网平台

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

华为AC旁挂二层组网配置详解:从DHCP部署到无线业务配置,完成网络搭建

组网需求 AC组网方式&#xff1a;旁挂二层组网。 DHCP部署方式&#xff1a; AC作为DHCP服务器为AP分配IP地址。 防火墙作为DHCP服务器为STA分配IP地址。 业务数据转发方式&#xff1a;直接转发。 网络拓扑图 对于旁边路直接转发&#xff0c;优点就是数据流量不经过AC&…

决策树和随机森林介绍

hello大家好&#xff0c;俺是没事爱瞎捣鼓又分享欲爆棚的叶同学&#xff01;&#xff01;&#xff01;今天我来给大家介绍一下决策树与随机森林&#xff0c;说起随机森林俺还有件很久远的丑事&#xff0c;之前有关课的结课作业就是用模型训练并预测&#xff0c;那时我比较天真&…

OpenCV(第二关--读取图片和摄像头)实例+代码

以下内容&#xff0c;皆为原创&#xff0c;制作不易&#xff0c;感谢大家的关注和点赞。 一.读取图片 我们来读取图片&#xff0c;当你用代码读取后&#xff0c;可能会发现。怎么跟上传的图片颜色有些许的不一样。因为OpenCV的颜色通道是BGR&#xff0c;而我们平常用的matplotl…

百日筑基第六十天-学习一下Tomcat

百日筑基第六十天-学习一下Tomcat 一、Tomcat 顶层架构 Tomcat 中最顶层的容器是 Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个 Server可以包含至少一个 Service&#xff0c;用于具体提供服务。Service 主要包含两个部分&#xff1a;Conn…

Flask SQLALchemy 的使用

Flask SQLALchemy 的使用 安装 Flask-SQLAlchemy配置 Flask-SQLAlchemy定义模型创建数据库和表插入和查询数据更新和删除数据迁移数据库总结Flask-SQLAlchemy 是一个 Flask 扩展,它简化了 Flask 应用中 SQLAlchemy 的使用。SQLAlchemy 是一个强大的 SQL 工具包和对象关系映射(…

【AI智能体】在AI浪潮中,程序员如何在这复杂的环境中生存下去

在这个瞬息万变的时代&#xff0c;人工智能&#xff08;AI&#xff09;如同一阵狂风&#xff0c;席卷了各行各业&#xff0c;尤其是程序员这一群体。面对AI的迅猛发展&#xff0c;程序员们不仅要适应新的技术潮流&#xff0c;更要在这场变革中找到自己的立足之地。如何在AI浪潮…

Shader笔记:光照与阴影1

引&#xff1a;旋转动画&#xff08;三角函数&#xff09; float3 rotationY(float3 vertex){float c cos(_Time.y*_Speed);float s sin(_Time.y*_Speed);float3x3 m {c,0,s,0,1,0,-s,0,c};return mul(m,vertex); } v2f vert (a2v v) {v2f o;o.pos UnityObjectToClipPos(r…

Charles苹果手机https抓包

1、电脑设置Charles代理端口 1)设置代理端口 Proxy-》Proxying Settings-》HTTP Proxy 设置端口 2)设置监控的代理地址 Proxy-》SSL Proxying Settings 添加Add允许所有地址*.* 2、电脑导入Charles的ssl证书 3、电脑查看Charles的IP地址和端口 4、手机无线wifi配置代理 5、手…

Vue3常见知识**MS【4】

一、vue2和vue3的区别 1、数据绑定原理不同 vue2&#xff1a;数据绑定是利用ES5的一个API&#xff1a;Object.definePropert() 对数据进行劫持&#xff0c;结合发布订阅模式的方式来实现的。 vue3&#xff1a;使用了ES6的Proxy API对数据代理。相比vue2.x&#xff0c;使用proxy…

【Java设计模式】Builder模式:在Java中清晰构建自定义对象

文章目录 【Java设计模式】Builder模式&#xff1a;在Java中清晰构建自定义对象一、概述二、Builder设计模式的意图三、Builder模式的详细解释及实际示例四、Java中Builder模式的编程示例五、Builder模式类图六、Java中何时使用Builder模式七、Builder模式Java教程八、Builder模…

【Linux篇】Linux的压缩与解压

1. 压缩格式 市面上有非常多的压缩格式&#xff1a; zip格式&#xff1a;Linux&#xff0c;win&#xff0c;MacOS&#xff0c;常用7zip&#xff1a;win常用rar&#xff1a;win常用tar&#xff1a;Linux&#xff0c;MacOS常用gzip&#xff1a;Linux&#xff0c;MacOS常用 如何…

C++_ch07_visual studio调试代码

C_ch07_visual studio调试代码 1.1 Break Point 断点就是程序执行到这里就会暂停&#xff0c;一个程序可以设置很多短点。在visual studio中只需要点击侧栏就可以设置断点。 点击左边的栏目&#xff0c;出现红点就是设置的断点。 另外要确保打断点的位置必须是可执行的代码&…

WordPress美化节日灯笼插件,适合春节的时候使用

源码介绍&#xff1a; WordPress美化节日灯笼插件&#xff0c;适合每年过年的时候安在网站上使用&#xff0c;这款插件可以备用着&#xff0c;一款WordPress节日灯笼美化插件&#xff0c;可以给网页自动加一个灯笼效果使用说明&#xff1a;到网站WP后台 - 插件 - 安装插件 - 上…

【学术会议征稿】第六届智能控制、测量与信号处理国际学术会议 (ICMSP 2024)

第六届智能控制、测量与信号处理国际学术会议 (ICMSP 2024) 2024 6th International Conference on Intelligent Control, Measurement and Signal Processing 文化是人类社会相对于经济和政治的精神活动和产物。传统的人类观念认为&#xff0c;文化是一种社会现象&#xff0…

CDGA|数据治理:统一数据标准成为核心关切

在数字化转型浪潮席卷全球的今天&#xff0c;数据已成为企业最宝贵的资产之一&#xff0c;其价值不言而喻。然而&#xff0c;随着数据量呈爆炸式增长&#xff0c;数据来源多样化、格式不一、质量参差不齐等问题日益凸显&#xff0c;给企业的数据管理和利用带来了前所未有的挑战…

C语言基础(二十)

链表是一种常见的数据结构&#xff0c;通常用来存储一系列元素&#xff0c;每个元素由一个节点来表示。在链表中&#xff0c;每个节点包含两部分&#xff1a;数据元素本身和指向下一个节点的指针。这种结构使得链表中的元素在内存中不是连续存储的&#xff0c;而是通过指针连接…

电商支付异常处理分享

时间&#xff1a;2024年08月28日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频地址&#xff1a;https://xima.tv/1_1qSvgv?_sonic0 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋内推一下&#x…

Spring Boot如何压缩Json并写入redis?

1.为什么需要压缩json&#xff1f; 由于业务需要&#xff0c;存入redis中的缓存数据过大&#xff0c;占用了10G的内存&#xff0c;内存作为重要资源&#xff0c;需要优化一下大对象缓存&#xff0c;采用gzip压缩存储&#xff0c;可以将 redis 的 kv 对大小缩小大约 7-8 倍&…

如何考取PostgreSQL认证证书?

PostgreSQL数据库炙手可热&#xff0c;国内知名的腾讯云TDSQL、阿里云PolarDB都有PostgreSQL版本的产品&#xff0c;还有人大金仓、华为opengauss、翰高数据库等都跟PostgreSQL有关系&#xff0c;所以考一个PostgreSQL认证非常有必要。要获得PostgreSQL认证&#xff0c;可以从以…