什么是CSRF攻击?

article/2025/9/26 14:17:43

什么是 CSRF 攻击?

CSRF 概念:CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者 Session Riding,通常缩写为 CSRF 或者 XSRF,是一种对网站的恶意利

尽管听起来像跨站脚本(XSS),但它与 XSS 非常不同,XSS 利用站点内的信任用户,而 CSRF 则通过伪装成受信任用户的请求来利用受信任的网站。

与 XSS 攻击相比,CSRF 攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难 以防范,所以被认为比 XSS 更具危险性。

CSRF 攻击原理

浏览器中 HTTP(s) 请求是会自动帮我们把 cookie 带上传给服务端的。这样在每次请求的时候通过 cookie 获取 session id,然后 通过它在服务端获取登录信息即可完成用户权限的校验。 本来这也是个不错的功能。但是由于 cookie 实在是太开放了,如果一个用户在 A 网站 登录了,并且在没有登出的情况下(没有清除本地信息,包括 cookie),用户在 B 网站 访问的时候发送了一个 A 网站的请求,那么这个请求其实是带有这个用户在 A 网站的登 录信息的。如果这时候 B 站发送的 A 网站请求是用户不知道的,并且可以进行用户非本 意操作(获取信息,修改内容,转账等等)。那就是非常严重的危害了。以上的过程就是 跨站请求攻击,即 Cross-Site Request Forgery,即 CSRF。 下面来看一张图:

接下来按照上面的步骤,基于 NodeJS 服务的代码来模拟 CSRF 攻击。

1. 用户访问网站 A(localhost:8081)

网站 A 的页面结构,以及相关交互。

<p>我是 server 1</p>
<button>登陆</button>
<script> 
$('button').on('click', function () {$.ajax({type: 'GET',url: '/login',success(data) {alert('成功')}});
})
</script>

服务器 A 的相关代码 :

const express = require('express');
const cookieParser = require('cookie-parser');
const url = require('url');
const server1 = express();
server1.use(cookieParser());
server1.use(express.static('./server1'));
// 设置登陆接口
server1.get('/login', function (req, res) {res.cookie('id', 3000)res.end('ok')
});
// 设置查询接口
server1.get('/getMoney', function (req, res) {res.end("" + server1Money);
});
// 设置支付接口
server1.get('/payMoney', function (req, res) {// 存在用户 cookie id 几个进行交易。if (req.cookies.id) {// 执行交易过程const query = url.parse(req.url, true).query;users[query.user] += +query.money;users.server1 -= +query.money;res.json(users);// 不存在跳转到登陆界面,不允许操作。} else {res.redirect('/')}
});
// 监听 8081 端口
server1.listen(8081, function () {console.log('server is running at 8081');
});

2. 用户点击登陆后,离开网站 A,访问网站 B(localhost:8082)

3. 当用户点击链接够,调用的其实是支付的接口。

经历了这样的过程,之后完成了一次 CSRF 攻击,就是利用了浏览器里面 cookie 使用过于 便利,当从有问题的网站发送出来,还是会获取 cookie 获取权限,最终导致这样的问题。

CSRF 的危害

简单总结 CSRF 漏洞就是利用网站权限校验方面的漏洞在用户不知觉的情况下发送请求, 达到“伪装”用户的目的。攻击者利用 CSRF 实现的攻击主要有以下几种:

1. 攻击者能够欺骗受害用户完成该受害者所允许的任一状态改变的操作,比如:更新 账号细节,完成购物,注销甚至登录等操作

2. 获取用户的隐私数据

3. 配合其他漏洞攻击

4. CSRF 蠕虫

其中 CSRF 蠕虫如其名所指就是产生蠕虫效果,会将 CSRF 攻击一传十,十传百。如:某 社区私信好友的接口和获取好友列表的接口都存在 CSRF 漏洞,攻击者就可以将其组合成 一个 CSRF 蠕虫——当一个用户访问恶意页面后通过 CSRF 获取其好友列表信息,然后再利 用私信好友的 CSRF 漏洞给其每个好友发送一条指向恶意页面的信息,只要有人查看这个 信息里的链接,CSRF 蠕虫就会不断传播下去,其可能造成的危害和影响非常巨大。

从本质上讲,CSRF 漏洞就是黑客将一个 http 接口中需要传递的所有参数都预测出来,然 后不管以什么方式,他都可以根据他的目的来任意调用你的接口,对服务器实现 CURD 操 作,就是对服务器中的数据进行增删改查。

如何防范 CSRF 攻击

从上文的描述中我们可以知道 CSRF 有两个特点:利用 cookie 自动携带的特性以及站攻击。那么针对这两个特性可以使用如下解决方法:

检查 Referer 字段

大家都知道 HTTP 头中有一个 Referer 字段,这个字段用以标明请求来源于哪个地址。 通过在网站中校验请求的该字段,我们能知道请求是否是从本站发出的。我们可以拒绝一 切非本站发出的请求,这样避免了 CSRF 的跨站特性。这种方式利用了客户端无法构造 Referrer 的特性,虽然简单,不过当网站域名有多个, 或者经常变换域名的时候会变得非常的麻烦,同时也具有一定的局限性。

Token 验证

由于 CSRF 是利用了浏览器自动传递 cookie 的特性,另外一个防御思路就是校验信息不 通过 cookie 传递,在其他参数中增加随机加密串进行校验。为每一个提交增加一个指定 串参数,该参数服务端通过页面下发,放到 localStorage 中,每次请求的时候补充到提 交参数中,服务端通过校验该参数是否一致来判断是否是用户请求。由于 CSRF 攻击中攻 击者是无从事先得知该字符串,所以服务端就可以通过校验该值拒绝可以请求。

 

 

 

 


http://chatgpt.dhexx.cn/article/QxK0ZQAg.shtml

相关文章

【Web 安全】CSRF 攻击详解

文章目录 一、CSRF 简介二、CSRF 原理三、CSRF 的危害四、CSRF 的攻击类型1. GET型2. POST型 五、CSRF 的防御1. 验证 HTTP Referer 字段2. 在请求地址中添加 token 并验证3. 在 HTTP 头中自定义属性并验证 六、WAF 防御 CSRF参考链接 一、CSRF 简介 CSRF&#xff08;Cross Si…

如何强制卸载软件,强制卸载的工具。

日常使用电脑过程中经常会遇到一些流氓捆绑软件&#xff0c;今天我们教大家如何轻松的强制卸载流氓软件。非常小巧而且强大的一款强制卸载工具&#xff0c;干净清爽。 工具/原料 Geek Uninstaller 方法/步骤 首先我们下载工具&#xff0c;百度输入geek点击搜索&#xff0c;如下…

HTML文件命名_没有删不掉的文件:强制终止、一键解锁,样样精通

微信搜一搜 麦克NO1 日常在使用电脑的时候&#xff0c;经常会遇到这样一个问题&#xff1a;想要删除某文件夹里的文件是&#xff0c;系统弹出&#xff1a;该文件无法删除、被系统占用等。那么&#xff0c;一旦遇到该问题该如何应对呢&#xff1f;以后不再担心&#xff0c;接下来…

使用管理员权限强制删除文件夹

1、鼠标右键要删除的文件&#xff0c;选择属性&#xff0c;如图所示&#xff1a;2、在界面中&#xff0c;切换到安全选项&#xff0c;点击编辑按钮&#xff0c;如图所示&#xff1a; 3、在窗口中&#xff0c;点击添加&#xff0c;接着在界面中输入对象名称来选择里面输入Admin…

强制删除鲁大师所有文件

方法一&#xff1a;“操作无法完成 文件已在windows文件资源管理器中打开”评论最多的解决办法 当出现拒绝访问的情况&#xff0c;可用方法二 方法二&#xff1a;Windows 10下删除鲁大师卸载后的残留文件夹 1.按住WinR&#xff0c;出现运行对话框&#xff0c;输入regedit&am…

win10 强制删除文件夹

在win10下编译代码时&#xff0c;发现无法通过delete删除build文件夹&#xff0c;提示需要用户权限&#xff0c;参考该教程&#xff0c;可以利用命令行进行删除。 在资源管理器中打开power shell 显示的powershell如下&#xff1a; 删除指定的文件夹或文件

Android 单元测试 一

最近在看软件TDD方面的知识&#xff0c;联想到android也有单元测试&#xff0c;所以就打算实践下&#xff0c;至于为啥要做单元测试&#xff0c;单元测试有那些好处&#xff0c;看官请移步 度娘和google。现在就记录下单元测试第一弹。我用的AS&#xff0c;AS在我们新建一个pro…

Docker版Jenkins持续集成环境部署

前提&#xff1a; 1、已配置java环境 2、已配置maven环境 3、已安装tomcat 一、Jenkins安装 1. jenkins部署 1.1 命令行启动方式 java -jar jenkins.war --httpPort80811.2 Tomcat 部署方式 将下载的jenkins.war包放到apache-tomcat-9.0.30/webapps目录下如果启动不想带ht…

java做简单的unitTest

一、单元测试准备 引入junit和mockito包 单元测试主要注解&#xff1a; SpringBoot RunWith 测试运行器 Before 在测试方法之前运行 Test 测试方法 After 测试方法之后运行 InjectMocks 待测试类 Mock 测试中需要使用到的类(模拟类) Spy 测试中需要使用到的类(真实类) 单元测…

网络编程懒人入门(一):快速理解网络通信协议(上篇)

1、写在前面 论坛和群里常会有技术同行打算自已开发IM或者消息推送系统&#xff0c;很多时候连基本的网络编程理论&#xff08;如网络协议等&#xff09;都不了解&#xff0c;就贸然定方案、写代码&#xff0c;显得非常盲目且充满技术风险。 即时通讯网论坛里精心整理了《[通俗…

python入门之网络编程Scoket

1、网络编程基础&#xff1a; Sockets&#xff08;套接字&#xff09;可以在一个进程内&#xff0c;在同一机器上的进程之间&#xff0c;或者在不同主机的进程之间进行通信&#xff0c;主机可以是任何一台有连接互联网的机器。Socket主要是使用IP地址&#xff0c;协议&#xf…

CS编程入门篇

CS编程入门 第一部分&#xff1a;JavaScript、NodeJs CSS HTML1.1 前端1.2 网络 第二部分&#xff1a;Python第三部分&#xff1a;Java3.1 面对过程POP&#xff08;性能&#xff09;、面对对象OOP&#xff08;类、对象 封装、继承、多态&#xff09;、面向切面AOP 第四部分&a…

Python快速编程入门课后习题答案

文章目录 前言第一章一、填空题二、判断题三、选择题四、简答题 第二章一、填空题二、判断题三、选择题四、简答题 第三章一、填空题二、判断题三、选择题四、简答题 第四章一、单选题二、判断题三、填空题四、程序分析题 第五章一、选择题二、判断题三、填空题四、简答题五、程…

编程入门

这篇文章是特地为对编程有兴趣的同学特意准备的,非战斗人员请速速撤离。 0.选择一门编程语言 选择语言的话不需要纠结太多(但是不推荐易语言之流:),因为编程语言都是大同小异。并且在你精通一门语言之后再去学另一种编程语言时,你会发现卧槽要死要死,这么简单。 如果你…

Windows网络编程入门:简单的客户端和服务器通信程序调试

昨日入手Windows网络编程经络这本书&#xff0c;第一章给了Echo客户端和服务器的简单通信实例程序。从小白到入门目测都是比较苦逼&#xff0c;居然想不到怎么来测试结果。什么同时运行啊、分别编译运行啊乱七八糟的想法就开始冒。最后还是解决了。 1.运行“服务器.exe”文件 …

编程算法同步入门

课程内容 开篇词 | 为什么我们要学习编程? 为什么需要学习编程? 如今,学习编程的人分为两类,一类是程序员,另一类是期望成为程序员的人。 编程这个事儿,在大多数人眼中还是一种特定领域的、专门的技能,认为学的人都是需要以此谋生的。 其实,作为一个“码龄”超过2…

编程入门硬件部分

01 概述 02 计算机硬件 冯 诺依曼体系结构 每台计算机都有一个内部时钟&#xff0c;该时钟以固定速度发射电子脉冲。时钟速度越快&#xff0c;在给 定的时间段内执行的指令就越多。速度的计量单位是 赫兹 ( 1Hz 相当于每秒 1 个脉 冲 。 随着 CPU 速度不断提高&#xff0c;目前…

C# Socket网络编程入门(服务器与客户端通信,客户端与客户端通信)

WebSocket全双工通讯链接&#xff0c;用于前台和后台自由发送信息 一.效果展示&#xff1a; 效果描述&#xff1a; 1.服务器充当管理员&#xff0c;给所有人发送信息&#xff0c;除服务器以外其他人都能接受到。 2.其他用户发送信息除自己以外其他用户和管理员全能接受到。 …

TCP/IP网络编程 学习笔记_1 --网络编程入门

前言&#xff1a;这个系列网络编程教程实例代码是在Xcode上运行的&#xff0c;MacOSX&#xff0c;是一个基于UNIX核心的系统&#xff0c;所以基于Linux的网络编程代码一般可以直接在Xcode上运行&#xff0c;如果要移植到Windows其实就只需要稍微改下&#xff0c;本章下面有讲Wi…

Scratch编程入门

Scratch编程入门 Scratch是麻省理工学院的“终身幼儿园团队”&#xff08;Lifelong Kindergarten Group&#xff09;开发的图形化编程工具&#xff0c;免费。2019年1月2日正式发布, Scratch3.0。 Scratch把计算机执行的指令、逻辑变成了小朋友能看明白的“积木”&#xff0c;…