Web后端:CSRF攻击及应对方法

CSRF攻击是开发Web后端时需要重点解决的问题。

那么什么是CSRF攻击呢?

CSRF跨站点请求伪造(Cross—Site Request Forgery),其主要利用的是Cookie的一个弱点,就是Cookie 最初被设计成了允许在第三方网站发起的请求中携带:

关于Cookie :

HTTP 协议是无状态的,可以通过 Cookie 来维持客户端与服务端之间的“会话状态”。服务端通过 Set-Cookie 响应头设置 Cookie 到客户端,而客户端浏览器会自动在下次向服务器发送请求时添加名为 Cookie 的请求头,以携带服务端之前“埋下”的内容,从而使得服务端可以识别客户端的身份。

第三方Cookie:

由当前a.com 页面发起的请求的 URL 不一定也是 a.com 上的,可能有 b.com 的,也可能有 c.com 的。如果把发送给 a.com 上的请求叫做第一方请求(first-party request),发送给 b.com 和 c.com 等的请求叫做第三方请求(third-party request),第三方请求和第一方请求一样,都会带上各自域名下的 cookie,所以就有了第一方 cookie(first-party cookie)和第三方 cookie(third-party cookie)的区别。CSRF 攻击,就是利用了第三方 cookie 。

 CSRF发起攻击的过程为:

1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

2.在用户信息通过验证后,网站A产生cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带第三方cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

那么如果应对CSRF攻击呢,主要有以下几种手段:

1. SameSite属性

Google 起草了一份草案来改进 HTTP 协议,就是为 Set-Cookie 响应头新增 SameSite 属性,它用来标明这个 cookie 是个“同站 cookie”,同站 cookie 只能作为第一方 cookie,不能作为第三方 cookie。SameSite 有两个属性值,分别是 Strict 和 Lax。

SameSite=Strict:

严格模式,表明这个 cookie 在任何情况下都不可能作为第三方 cookie,绝无例外。比如说假如 a.com 设置了如下 cookie:

Set-Cookie: foo=1; SameSite=Strict
Set-Cookie: bar=2

这时你在 b.com 下发起的对 a.com 的任意请求中,foo 这个 cookie 都不会被包含在 Cookie 请求头中,但 bar 会。举个实际的例子就是,假如淘宝网站用来识别用户登录与否的 cookie 被设置成了 SameSite=Strict,那么用户从百度搜索页面甚至天猫页面的链接点击进入淘宝后,淘宝都不会是登录状态,因为淘宝的服务器不会接受到那个 cookie,其它网站发起的对淘宝的任意请求都不会带上那个 cookie。

SameSite=Lax:

宽松模式,比 Strict 放宽了点限制:假如这个请求是改变了当前页面或者打开了新页面,且同时是个 GET 请求(因为从语义上说 GET 是读取操作,比 POST 更安全),则这个 cookie 可以作为第三方 cookie。比如说假如 a.com 设置了如下 cookie:

Set-Cookie: foo=1; SameSite=Strict
Set-Cookie: bar=2; SameSite=Lax
Set-Cookie: baz=3

当用户从 b.com 点击链接进入 a.com 时,foo 这个 cookie 不会被包含在 Cookie 请求头中,但 bar 和 baz 会,也就是说用户在不同网站之间通过链接跳转是不受影响了。但假如这个请求是从 b.com 发起的对 a.com 的异步请求(不会改变当前页面,也不会打开新页面),或者页面跳转是通过表单的 post 提交触发的,则 bar 也不会发送。

SameSite=None:

允许请求自动携带上 Cookie

2.通过请求头中的Referer 字段

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,浏览器会自动在其中设置该 HTTP 请求的来源地址,比如来源于a.com/xxx的请求,那么请求头中会包含

Referer: a.com/xxx 

因此后台程序只需检查HTTP请求头中的 Referer信息是不是就是本网站的URL即可。

3.通过XSRF-TOKEN

CSRF攻击之所以能产生,是因为当发起第三方请求时,浏览器会自动为请求添加Cookie,但实际上黑客是不知道Cooke的内容的,因此可以通过使用Token的方式来应对CSRF攻击,方法为:

1.后端程序定期的产生随机数,并把随机数以名字XSRF-TOKEN放入到Cookie中。

2.前端程序发送请求前,读取Cookie中的Token,然后将XSRF-TOKEN的内容放入到请求头的X-XSRF-TOKEN中(注Axios可以自动将Cookie中的XSRF-TOKEN放入到请求头的X-XSRF-TOKEN中)。

3后端程序接收道请求后,检查请求头中的X-XSRF-TOKEN是否为合法的Token。

这种应对方法的原理在于,攻击网站只能发起第三方请求,但是由于跨域原因,他是无法读取到Cookie的内容的,因此也就无法安置正确的X-XSRF-TOKEN,后端可以通过检查X-XSRF-TOKEN来判定这个请求是否为合法请求。

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

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

相关文章

RabbitMQ(一):最新版rabbitmq安装

目录 1 简介1.1特性及好处 2 安装2.1 Ubuntu22.04 apt安装最新rabbitmq1、一键部署2、验证3、RabbitMQWeb管理界面及授权操作4、添加远程用户5、一些常用命令 2.2 Docker安装RabbitMQ - Ubuntu22.041、安装docker2、启动rabbitmq 1 简介 RabbitMQ是一个开源的遵循AMQP协议实现…

【uniapp开发小程序】封装一个公共接口,每次点击不同页面时都会调用

在uni-app中封装一个公共接口,让每次点击不同页面时都会调用,您可以使用uni-app的全局混入(mixin)功能来实现 1.创建一个全局混入文件 mixin.js,并在其中定义一个公共方法: // mixin.js export default {…

设计模式之-适配器模式

在这个例子中,Adapter类继承自Target类,并在构造函数中接受一个Adaptee对象的指针。Adapter类的request方法会调用Adaptee对象的specificRequest方法。 在main函数中,我们创建了一个Adaptee对象和一个Adapter对象,并将Adaptee对象…

挑战杯 opencv 图像识别 指纹识别 - python

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器视觉的指纹识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖,适…

MagicVideo-V2:多阶段高保真视频生成框架

本项工作介绍了MagicVideo-V2,将文本到图像模型、视频运动生成器、参考图像embedding模块和帧内插模块集成到端到端的视频生成流程中。由于这些架构设计的好处,MagicVideo-V2能够生成具有极高保真度和流畅度的美观高分辨率视频。通过大规模用户评估&…

Zoho Projects与Jira:中国市场的理想替代品之争?

在软件开发生命周期中,项目管理一直是一个非常重要的环节。为了更好地协作、追踪项目的进程和管理任务,许多公司选择了Jira这款著名的项目管理工具,它是个非常强大的工具,但是作为一款纯国外产品,他可能不适合中国市场…

python统计分析——t分布

参考资料:用python动手学统计学 1、t统计量 t统计量的计算公式为: 其中,为样本均值,μ为总体均值,为实际样本的无偏标准差,N为样本容量。 t统计量的公式与标准化公式类似。t统计量可以理解为对样本均值…

css3动画的三种实现方式

目录 一、是什么二、实现方式transition 实现渐变动画transform 转变动画animation 实现自定义动画 三、总结参考文献 一、是什么 CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块 …

分布式session 笔记

概念 解决方案‘ 复制 session同步&#xff0c;让集群下的服务器进行session同步&#xff0c;一种传统的服务器集群session管理机制&#xff0c;常用于服务器不多的集群环境。<br /> 集群下&#xff0c;进行session同步的服务器的session数据是相同的&#xff0c;…

Redis面试题39

人工智能如何在交通领域发挥作用&#xff1f; 答&#xff1a;人工智能在交通领域发挥着重要的作用&#xff0c;可以改善交通效率和安全性。以下是一些人工智能在交通领域的应用示例&#xff1a; 交通流量优化&#xff1a;人工智能可以通过分析实时交通数据、监控摄像头图像和传…

【JavaScript 漫游】【007】数据类型转换

文章简介 本文为【JavaScript 漫游】专栏的第 007 篇文章&#xff0c;对 JS 数据类型转化语法进行了简记。 数据类型的转换指的是将 JS 的某一数据类型的值转换为 JS 的某一原始数据类型的值&#xff0c;也就是 number、string 和 boolean。 Number 方法强制转换为 number 类…

信创系统软件开发环境搭建(QT篇)

信创系统软件开发环境搭建&#xff08;QT篇&#xff09; 前言Ubuntu 版本选择QT 版本选择Ubuntu 开发相关软件安装问题 前言 信创系统&#xff0c;包括统信 UOS 和麒麟系统都是基于 Linux 系统开发&#xff0c;所以要开发信创系统软件&#xff0c;优选 Linux 系统。而 Linux 系…

鲜花销售|鲜花销售小程序|基于微信小程序的鲜花销售系统设计与实现(源码+数据库+文档)

鲜花销售小程序目录 目录 基于微信小程序的鲜花销售系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、前台功能模块 2、后台功能模块 (1) 后台登录 (2) 管理员功能模块 用户管理 商家管理 鲜花信息管理 鲜花分类管理 管理员管理 系统管理 (3) 商家功…

2017年苏州大学837复试机试C/C++

2017年苏州大学复试机试 要求 要求用C/C编程&#xff1b;对程序中必要的地方进行注释。上机规则 请在电脑桌面上新建一个文件夹文件夹名为考试姓名&#xff08;中文&#xff09;&#xff1b;考试完毕后&#xff0c;将所编写的文件放在上述文件中。 第一题&#xff08;20分&…

CSS的元素显示模式

一&#xff0c;什么是元素显示模式 元素显示模式是指元素以什么方式显示&#xff0c; 作用&#xff1a;了解不同类型的标签可以更好的布局网页。 HTML元素一般分为块元素和行内元素。 1.1块元素 常见的块元素有&#xff1a;<p><ul><ol><li>,<di…

window 搭建 Flutter for Android的环境(二)

最近又重置了笔记本系统&#xff0c;因此又得重新部署Flutter环境&#xff0c;所以就再重新整理了一下&#xff1a; 下载安装好Android、git下载安装好对应版本的Flutter 下载地址:部署环境变量&#xff1a; ANDROID_HOME C:\Users\Administrator\AppData\Local\Android\SdkC:…

winserver2012远程黑屏且无法操作

当我们遇到远程windows服务器发现GUI图形加载异常&#xff0c;黑屏显示&#xff0c;且无法进行任何操作&#xff0c;我们可以尝试以下方法。 1.尝试远程命令重启 #11.11.11.11 远程服务器ip #Administrator 远程桌面用户名 #12345678 密码 #shutdown.exe -r -f 在一分钟…

【计算机网络】HTTPS协议原理

文章目录 一、相关基础概念1.HTTPS 是什么2.什么是"加密"3.为什么要加密4.常见的加密方式5.数据摘要 && 数据指纹 二、HTTPS 的工作过程 -- 加密方式1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.非对称加密 对称加密5.中间人攻击6.证书7.非…

力扣144 二叉树的前序遍历 Java版本

文章目录 题目描述递归方法代码 非递归方法代码 题目描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xf…

ElementUI Data:Table 表格

ElementUI安装与使用指南 Table 表格 点击下载learnelementuispringboot项目源码 效果图 el-table.vue&#xff08;Table表格&#xff09;页面效果图 项目里el-table.vue代码 <script> export default {name: el_table,data() {return {tableData: …