【网络安全】一文带你了解什么是【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,提示特殊总帐标志类型“汇票和”预付定金“的特别总帐标志的过帐代码不能预制,这是系统写死的ÿ…...
终极Windows文件完整性验证指南:为什么专业开发者都选择HashCheck Shell Extension
终极Windows文件完整性验证指南:为什么专业开发者都选择HashCheck Shell Extension 【免费下载链接】HashCheck HashCheck Shell Extension for Windows with added SHA2, SHA3, and multithreading; originally from code.kliu.org 项目地址: https://gitcode.co…...
策划和程序不再打架:Unity+Excel打造可视化游戏数据配置工作流
Unity与Excel深度整合:构建高效游戏数据配置系统 在中小型游戏开发团队中,策划与程序之间的数据流转往往是效率瓶颈所在。策划需要频繁调整数值平衡,而程序员则疲于应对无尽的配置表更新请求。这套基于UnityExcel的工作流解决方案,…...
Maven阿里云镜像配置详解:提升依赖下载速度的终极方案
Maven阿里云镜像配置实战:突破国内依赖下载瓶颈的完整指南 每次打开IDE准备大干一场时,最扫兴的莫过于看着Maven依赖下载进度条像蜗牛一样缓慢爬行。作为Java开发者,我们都经历过中央仓库下载速度只有几十KB/s的煎熬时刻——特别是当团队新成…...
Java响应式编程实战:用Reactor 3.x处理高并发请求(附完整代码示例)
Java响应式编程实战:用Reactor 3.x处理高并发请求(附完整代码示例) 在当今高并发的互联网应用中,传统的同步阻塞式编程模型往往成为性能瓶颈。想象一下,当你的电商系统在秒杀活动中面临每秒数万次的请求时,…...
从零推导贝尔曼方程:强化学习中的价值函数与策略优化
1. 强化学习中的价值函数基础 想象你正在玩一个迷宫游戏,每走一步都会消耗体力,找到出口能获得大奖。这时候你会想:**"从当前位置出发,最终能获得多少奖励?"这个问题的答案就是价值函数(Value Fu…...
MinerU效果展示:精准识别表格数据,财务报告一键解析
MinerU效果展示:精准识别表格数据,财务报告一键解析 1. 引言:当AI遇见财务报表 想象一下,你是一名财务分析师,面前堆着几十份上市公司最新发布的PDF财报。你需要从中快速提取近三年的营收、利润、现金流等关键数据&a…...
[小红书AI自动化教程]凌晨2点我在睡觉,AI偷偷发了篇小红书爆款:醒来99+点赞,人类社媒苦役终结?
我把小红书交给 OpenClaw,它开始自己干活了 凌晨两点,我在睡觉,它却偷偷发了一篇爆款。 醒来点赞99,评论全是“姐妹求链接”。这不是科幻。去年我还为追热点熬夜秃头,如今一句“今天发什么”,AI 就能完成选…...
SleeperX:Mac电源管理的智能守护者,让每一次工作都不被打断
SleeperX:Mac电源管理的智能守护者,让每一次工作都不被打断 【免费下载链接】SleeperX MacBook prevent idle/lid sleep! Hackintosh sleep on low battery capacity. 项目地址: https://gitcode.com/gh_mirrors/sl/SleeperX 您是否经历过这样的时…...
OpenClaw备份方案:GLM-4.7-Flash自动化任务配置保存与恢复
OpenClaw备份方案:GLM-4.7-Flash自动化任务配置保存与恢复 1. 为什么需要备份OpenClaw配置 上周我的开发机突然遭遇硬盘故障,导致所有OpenClaw配置丢失。当时正在运行的三个自动化流程全部中断,包括每天凌晨自动执行的日报生成和每周五的代…...
探索 COMSOL 三维多孔介质建模的魅力
comsol三维多孔介质 COMSOL三维多孔介质。 1.孔隙率孔径可控 2.一键区分固相孔相,简单方便 3.可设置五种粒径不同,含量不同的颗粒。嘿,各位科研和工程领域的小伙伴们!今天咱们来聊聊 COMSOL 里的三维多孔介质建模,这玩…...
