【网络安全】一文带你了解什么是【CSRF攻击】
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击方式,它利用已认证用户在受信任网站上的身份,诱使用户在不知情的情况下执行恶意操作。具体来说,攻击者通过各种方式(如发送恶意链接、在第三方网站上嵌入恶意代码等)诱导用户的浏览器发送未经授权的请求到受信任的网站。这些请求会携带用户的认证信息(如Cookie、Session),从而让受信任的网站误以为是用户本人发起的合法请求。
目录
1 CSRF攻击的基本原理
2 预防CSRF攻击的方法
3 使用CSRF令牌(Token)的具体实现
3.1 在服务器端生成CSRF令牌
3.2 在HTML表单中包含CSRF令牌
3.3 在服务器端验证CSRF令牌
3.4 解析请求体(中间件)
3.5 完整的示例代码
3.7 注意事项
1 CSRF攻击的基本原理
- 用户登录受信任的网站:用户在受信任的网站上登录,浏览器保存了该网站的会话Cookie。
- 用户访问恶意网站:攻击者诱导用户访问恶意网站或点击恶意链接。
- 恶意网站发送请求:恶意网站构造一个请求,利用用户的浏览器发送到受信任的网站。由于用户已经登录,浏览器会自动附带用户的会话Cookie。
- 受信任的网站处理请求:受信任的网站接收到请求后,看到附带的合法会话Cookie,以为这是用户发起的合法请求,从而执行相应的操作。
2 预防CSRF攻击的方法
- 使用CSRF令牌(Token):在每次提交表单时,服务器生成一个唯一的CSRF令牌,并将其包含在表单中。服务器在处理请求时验证令牌的有效性,确保请求来自合法的来源。
- 验证HTTP头部:检查请求的来源(Referer或Origin头部),确保请求是从受信任的域名发出的。
- 使用双重提交Cookie:在请求中同时包含会话Cookie和一个自定义的CSRF令牌,服务器验证这两个值是否一致。
- 使用SameSite Cookie属性:设置Cookie的SameSite属性为Strict或Lax,限制Cookie的跨站使用,从而减少CSRF攻击的风险。
CSRF攻击的目标通常是执行用户不希望的操作,例如更改账户设置、进行交易或发送敏感数据等。因此,理解和防范CSRF攻击对于保护用户的安全至关重要。
3 使用CSRF令牌(Token)的具体实现
使用CSRF令牌(Token)是防范CSRF攻击的一种有效方法。下面是一个具体的实现步骤,假设你使用的是Node.js和Express框架,前端使用HTML和JavaScript。
3.1 在服务器端生成CSRF令牌
首先,需要在服务器端生成一个唯一的CSRF令牌,并将其存储在用户的会话中。
const express = require('express');
const session = require('express-session');
const crypto = require('crypto');const app = express();app.use(session({secret: 'your_secret_key',resave: false,saveUninitialized: true
}));// 中间件:生成CSRF令牌并存储在会话中
app.use((req, res, next) => {if (!req.session.csrfToken) {req.session.csrfToken = crypto.randomBytes(32).toString('hex');}next();
});
3.2 在HTML表单中包含CSRF令牌
在服务器端的响应中,需要将CSRF令牌包含在HTML表单中,通常以隐藏字段的形式。
app.get('/form', (req, res) => {res.send(`<form action="/submit" method="POST"><input type="hidden" name="csrfToken" value="${req.session.csrfToken}"><!-- 其他表单字段 --><button type="submit">Submit</button></form>`);
});
3.3 在服务器端验证CSRF令牌
在处理表单提交请求时,服务器需要验证提交的CSRF令牌是否有效。
app.post('/submit', (req, res) => {const { csrfToken } = req.body;if (csrfToken !== req.session.csrfToken) {return res.status(403).send('CSRF token mismatch');}// 处理表单提交res.send('Form submission successful');
});
3.4 解析请求体(中间件)
为了从POST请求中解析CSRF令牌,需要使用body-parser中间件。
const bodyParser = require('body-parser');app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
3.5 完整的示例代码
下面是完整的示例代码,将上述步骤结合起来:
const express = require('express');
const session = require('express-session');
const crypto = require('crypto');
const bodyParser = require('body-parser');const app = express();app.use(session({secret: 'your_secret_key',resave: false,saveUninitialized: true
}));app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());app.use((req, res, next) => {if (!req.session.csrfToken) {req.session.csrfToken = crypto.randomBytes(32).toString('hex');}next();
});app.get('/form', (req, res) => {res.send(`<form action="/submit" method="POST"><input type="hidden" name="csrfToken" value="${req.session.csrfToken}"><!-- 其他表单字段 --><button type="submit">Submit</button></form>`);
});app.post('/submit', (req, res) => {const { csrfToken } = req.body;if (csrfToken !== req.session.csrfToken) {return res.status(403).send('CSRF token mismatch');}// 处理表单提交res.send('Form submission successful');
});app.listen(3000, () => {console.log('Server is running on http://localhost:3000');
});
3.7 注意事项
- CSRF令牌的生成和验证应尽量使用加密安全的随机数生成方法。
- 确保CSRF令牌的存储和传输安全,避免令牌被第三方窃取。
- 每次会话开始时生成新的CSRF令牌,确保令牌的唯一性和不可预测性。
相关文章:
【网络安全】一文带你了解什么是【CSRF攻击】
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击方式,它利用已认证用户在受信任网站上的身份,诱使用户在不知情的情况下执行恶意操作。具体来说,攻击者通过各种方式(如发送恶意链…...
短视频电商源码如何选择
在数字时代的浪潮下,短视频电商以其直观、生动、互动性强的特点,迅速崛起成为电商行业的一股新势力。对于有志于进军短视频电商领域的创业者来说,选择一款合适的短视频电商源码至关重要。本文将从多个角度探讨如何选择短视频电商源码…...
444444
356前期...
初识LangChain的快速入门指南
个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] 📱…...
OpenBayes 教程上新 | CVPR 获奖项目,BioCLlP 快速识别生物种类,再也不会弄混小浣熊和小熊猫了!
市面上有很多植物识别的 App,通过对植物的叶片、花朵、果实等特征进行准确的识别,从而确定植物的种类、名称。但动物识别的 App 却十分有限,这使我们很难区分一些外形相似的动物,例如小浣熊和小熊猫。 左侧为小浣熊,右…...
24 年程序员各岗位薪资待遇汇总(最新)
大家好,我是程序员鱼皮。今天分享 24 年 6 月最新的程序员各岗位薪资待遇汇总。 数据是从哪儿来的呢?其实很简单,BOSS 直聘上有一个免费的薪酬查询工具,只要认证成为招聘者就能直接看,便于招聘者了解市场,…...
Android SurfaceFlinger——系统动画服务启动(十四)
在了解了 SurfaceFlinger、HWC、OpenGL ES 和 EGL 等相关概念和基础信息后,我们通过系统动画的调用流程引入更多的内容。 一、解析init.rc 开机就启动进程,肯定就要从 rc 文件开始。负责开机动画的进程是 bootanimation。 1、bootanim.rc 源码位置:/frameworks/base/cmds…...
VaRest插件常用节点以及Http请求数据
1.解析json (1)Construct Json Object:构建json对象 (2)Decode Json:解析json 将string转换为json (3)Encode json:将json转换为string (4)Get S…...
【Linux】线程id与互斥(线程三)
上一期我们进行了线程控制的了解与相关操作,但是仍旧有一些问题没有解决 本章第一阶段就是解决tid的问题,第二阶段是进行模拟一个简易线程库(为了加深对于C库封装linux原生线程的理解),第三阶段就是互斥。 目录 线程id…...
JavaEE—什么是服务器?以及Tomcat安装到如何集成到IDEA中?
目录 ▐ 前言 ▐ JavaEE是指什么? ▐ 什么是服务器? ▐ Tomcat安装教程 * 修改服务端口号 ▐ 将Tomcat集成到IDEA中 ▐ 测试 ▐ 结语 ▐ 前言 至此,这半年来我已经完成了JavaSE,Mysql数据库,以及Web前端知识的学习了&am…...
主流分布式消息中间件RabbitMQ、RocketMQ
分布式消息中间件在现代分布式系统中起着至关重要的作用。以下是一些主流的分布式消息中间件: 1. Apache Kafka - 特点:高吞吐量、低延迟、持久化、水平可扩展、分布式日志系统。 - 使用场景:日志收集与处理、实时流处理、事件驱动架构、大数…...
【Unity Linux】模型导致的Unity项目崩溃
模型需勾选Strip Bones。如不勾选,则开启项目崩溃。 也可以删除有问题模型的.meta文件。 (Unity默认会自动勾选,所以不会崩溃) 或打开.meta文件,将optimizeBones的值,由0改为1。(对应面板上的…...
22222
12212...
大数据领域的常用开发语言详解
大数据开发语言主要包括以下几个,以下是它们在大数据开发领域的优缺点和应用场景的详细说明: 1. Java 优点: 跨平台性:Java的“一次编写,到处运行”的特性使得其可以轻松地运行在多个操作系统上。面向对象ÿ…...
SpringBoot设置自动跳转前端界面
一般情况下,我们的Application启动文件的内容为一行的运行代码,默认启动项目以后不会自动跳转到我们的前端页面 public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);} 这里我的可以通过设置文件的内容&#…...
vue3前端解析大数据返给的数据格式
# xxx:111111111111111\n\n## 2222:\n- 99999999。\n- 564566556。\n- ", npm install marked import {marked} from markedmarked(# xxx:111111111111111\n\n## 2222:\n- 99999999。\n- 564566556。\n-)//就可以解析成 《…...
Incremental Player Build
*未解决,仅作记录 Unity 版本 2021.3.15f1 问题 Unity 发布webgl 平台卡在Incremental Player Build 界面。 解决 未找到明确原因,简化工程路径后发布成功。...
快钱支付股东全部股权已被质押!
根据近期工商信息,第三方支付机构快钱支付清算信息有限公司(简称“快钱支付”)实际控股方快钱金融服务(上海)有限公司(简称“快钱金融”),作为出质股权标的企业,被出质给…...
【鸿蒙学习笔记】数据类型
官方文档:ArkTS语言介绍 目录标题 声明变量声明常量数据类型 缺:byte charNumber类型 short int long float doubleBoolean类型 booleanString类型Void类型Object类型Array类型Enum类型Union类型Aliases类型 [代码总结] 声明变量 let hi: string hel…...
SAP实现特别总账的凭证预制
SAP实现特别总账的凭证预制 仔细理解只有”其他”的特殊总帐标识才可预制凭证这句话. F-29/f-48不可预制。F-29/f-48预制时出现错误消息号 FP 030,提示特殊总帐标志类型“汇票和”预付定金“的特别总帐标志的过帐代码不能预制,这是系统写死的ÿ…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...
开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例
在工业自动化控制系统中,常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中,客户现场采用了 罗克韦尔PLC,但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控,引入了开疆智能Etherne…...
Linux信号保存与处理机制详解
Linux信号的保存与处理涉及多个关键机制,以下是详细的总结: 1. 信号的保存 进程描述符(task_struct):每个进程的PCB中包含信号相关信息。 pending信号集:记录已到达但未处理的信号(未决信号&a…...
MAZANOKE结合内网穿透技术实现跨地域图像优化服务的远程访问过程
文章目录 前言1. 关于MAZANOKE2. Docker部署3. 简单使用MAZANOKE4. 安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在数字世界高速发展的今天,您是否察觉到那些静默增长的视觉数据正在悄然蚕食存储空间?随着影像记录成为日常习惯&…...
【QT】qtdesigner中将控件提升为自定义控件后,css设置样式不生效(已解决,图文详情)
目录 0.背景 1.解决思路 2.详细代码 0.背景 实际项目中遇到的问题,描述如下: 我在qtdesigner用界面拖了一个QTableView控件,object name为【tableView_electrode】,然后【提升为】了自定义的类【Steer_Electrode_Table】&…...
