CSRF 概念及防护机制

概述

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.rhkb.cn/news/411579.html

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

相关文章

微纳芯:如何利用CRM实现渠道分销管理的数字化转型

MINCHIP由联想控股投资,是一家专注于快速体外诊断产品的研发、生产、销售、服务的高科技企业,拥有多项自主知识产权及技术专利。致力于用专业的微流控临床检验产品,为全球大众提供触手可及、负担得起的健康服务。其系列全自动生化分析仪持续为医师、兽医师的机构运营提供解决方…

C++对C的扩充(8.28)

1.使用C手动封装一个顺序表&#xff0c;包括成员数组1个&#xff0c;成员变量n个 代码&#xff1a; #include <iostream>using namespace std;//类型重命名 using datatype int; #define MAX 30struct seqList { private: //私有权限datatype *data; //相当于 …

Java中的java.lang.ArithmeticException: null问题详解与解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

fixed、absolute 和 relative 布局

https://andi.cn/page/621716.html

0.0 C语言被我遗忘的知识点

文章目录 位移运算(>>和<<)函数指针函数指针的应用场景 strcmp的返回值合法的c语言实数表示sizeof 数组字符串的储存 —— 字符数组与字符指针字符串可能缺少 \0 的情况 用二维数组储存字符串数组其他储存字符串数组的方法 位移运算(>>和<<) 右移(>…

什么是智能体(agent)

智能体&#xff08;Agent&#xff09;是人工智能领域中的一个核心概念。在最基本的层面上&#xff0c;智能体可以被定义为一个实体&#xff0c;它能够在其所处的环境中自主地感知信息&#xff0c;并根据这些信息做出决策&#xff0c;以实现特定的目标或任务。智能体的关键特性包…

ONNX加载和保存模型

ONNX ONNX&#xff08;Open Neural Network Exchange&#xff09;是一个开放的格式&#xff0c;用于表示机器学习模型。它使得不同框架之间的模型可以互操作&#xff0c;方便模型的迁移和部署。以下是一些关于 ONNX 的基本介绍和使用方法。 模型转换&#xff1a;ONNX 允许你将…

罐装食品检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

罐装食品检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【Java】—— Java面向对象基础:Java中类的构造器与属性初始化,Student类的实例

目录 定义Student类 在main方法中创建Student对象 结论 在Java中&#xff0c;类的构造器&#xff08;Constructor&#xff09;是一个特殊的方法&#xff0c;用于在创建对象时初始化对象的属性。今天&#xff0c;我们将通过一个简单的Student类实例&#xff0c;来探讨如何在J…

给自己复盘用的tjxt笔记day12第一部分

优惠券使用 优惠券规则定义 对优惠券的下列需求: 判断一个优惠券是否可用,也就是检查订单金额是否达到优惠券使用门槛 按照优惠规则计算优惠金额,能够计算才能比较并找出最优方案 生成优惠券规则描述,目的是在页面直观的展示各种方案,供用户选择 因此,任何一张优惠券都…

Linux基础1-基本指令5(more,less,head,tail, | ,find)

本章继续整理其他linux基本指令 一.本章重点 1.more和less命令查看大文本 2.head和tail命令查看小文本和日志 3.使用管道多次处理信息 4.find指令 二.more和less more命令和less命令常用来查看大文本&#xff0c;其中less可以使用上下键快速浏览文本 使用方式 more文件 …

2024年6月GSEP(python)一级认证真题讲解

注意&#xff01;做题时长为2小时&#xff0c;孩子做完题目后对照讲解视频和讲解分析&#xff0c;针对薄弱点&#xff0c;进行有效的专项提高。 &#x1f451;讲解视频 2024.6GESPpython真题讲解 &#x1f451;讲解分析 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&a…

第15届蓝桥杯青少组Scratch初级组省赛真题试卷

第十五届蓝桥杯青少组省赛Scratch初级组真题试卷 题目总数&#xff1a;10 总分数&#xff1a;360 选择题 第 1 题 单选题 Scratch运行以下程序&#xff0c;角色会说( )? A.29 B.31 C.33 D.35 第 2 题 单选题 scratch运行下列哪个程序后&#xff0c;宇航…

在国产芯片上实现YOLOv5/v8图像AI识别-【4.1】RK3588训练数据时进行图像增强更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 图像…

【蓝桥杯集训100题】scratch绘制扇子 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第28题

scratch绘制扇子 蓝桥杯集训100题第28题模拟练习解析 此题曾经作为第十届省赛的真题考过 一、题目要求 以坐标(0,0)点为中心绘制一把扇子;扇面和扇把都是三分之一圆,扇面的半径 为 100 左右,扇把的半径为 20 左右。 编程实现 每次点击绿旗后,舞台背景为白色,…

CUDA-BEVFusion(1): 环境安装

文章目录 1. 查看ubantu配置2. 环境安装2.1 安装包下载2.1.1 tensorRT 下载2.1.2 CUDA 下载2.1.3 cuDNN 下载2.2 安装2.2.1 cuda 安装2.2.2 cuDNN 安装2.2.3 tensorRT安装3. 安装包下载1. 查看ubantu配置 查看GPU的版本sudo apt-get install pciutilslspci | grep VGA查看linux…

探索Python中的拼音魔法:pypinyin库的奇妙之旅

文章目录 探索Python中的拼音魔法&#xff1a;pypinyin库的奇妙之旅背景&#xff1a;为何选择pypinyin&#xff1f;库简介&#xff1a;pypinyin是什么&#xff1f;安装指南&#xff1a;如何将pypinyin纳入你的项目&#xff1f;功能探索&#xff1a;pypinyin的五大核心函数实战演…

win10配置adb环境变量

初始状态&#xff1a; 最简单的配置方案&#xff0c;直接复制adb所在路径&#xff1a; 粘贴进来确定即可&#xff1a; 然后打开 cmd 查看已经配置成功了&#xff1a;

图表检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

图表检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

位图

问题导入 解决方案 用哈希表位图概念&#xff0c; 但是每个key只占用一个bite位&#xff0c; 用0表示没有本key&#xff0c; 1表示有此key 位图实现 三个主要接口 set&#xff08;key&#xff09;&#xff0c; 将key设成1 reset&#xff08;key&#xff09;&#xff1a; 将…