CSRF 跨站请求伪造的实现原理和预防措施
CSRF(跨站请求伪造)概述
CSRF(Cross-Site Request Forgery),即跨站请求伪造,是一种攻击手段,攻击者利用受害者在网站上已认证的身份信息,诱使受害者发起未经授权的请求,从而对受害者账户执行不希望的操作。由于受害者的身份信息(如cookie)会自动随请求发送,攻击者可以借此执行一些恶意操作。
CSRF攻击原理
1.攻击者准备恶意请求:攻击者构造一个恶意的请求,例如修改密码、转账等,通常这个请求会嵌入到一个网站、邮件或网页广告等地方。该请求通常是向一个已经登录的用户所访问的站点发起的。
2.受害者访问恶意页面:受害者无意间访问了这个恶意页面,通常这个页面会包含恶意的链接、表单、图片等,可能通过 XSS 或社交工程学等方式诱使受害者点击或加载。
3.浏览器自动发送请求:当受害者访问该恶意页面时,浏览器会携带当前登录用户的认证信息(如cookie)自动发送请求。例如,如果用户已经登录了某个银行网站,恶意请求可能会是一个转账请求,浏览器会自动带上该银行网站的登录cookie。
4.恶意请求执行:由于请求看似是合法用户发起的,服务器无法识别请求的真正来源,最终执行了攻击者预设的操作。
CSRF的攻击场景
5.用户在登录状态下,点击攻击者精心设计的恶意链接。
6.恶意链接会以用户的名义向受害者已经登录的网站发起请求,执行一些危害性操作(如修改用户资料、转账、提交表单等)。
例如,假设攻击者希望在一个受害者的账户上转账,攻击者可以构造如下的恶意链接:
<img src="http://bank.com/transfer?amount=1000&toAccount=attackerAccount" />
当受害者访问此链接时,浏览器会自动发送请求,且该请求带有受害者的身份认证信息(如cookie),因此服务器会认为这是合法的请求并执行。
CSRF的预防措施
为了防止CSRF攻击,通常采取以下几种策略:
1. 使用Token防护(Anti-CSRF Token)
7.原理:每当用户发起请求时,服务器会在页面中插入一个随机的token,这个token是一个难以猜测的唯一标识符。每次用户发起请求时,都会将该token与请求一起发送,服务器根据token来验证请求是否合法。
8.实现方式:在表单中加入一个隐藏的字段,包含服务器生成的token,每次请求时客户端必须发送这个token。服务器验证请求中的token与当前会话中的token是否一致,如果不一致则拒绝请求。
例如,在HTML表单中插入一个隐藏的token字段:
<form method="POST" action="/transfer">
<input type="hidden" name="csrf_token" value="randomGeneratedToken">
<input type="text" name="amount" value="1000">
<input type="text" name="toAccount" value="1234567890">
<input type="submit" value="Transfer">
</form>
每次提交时,服务器会验证 csrf_token 是否与用户会话中的token一致。
2. 使用SameSite Cookie属性
9.原理:SameSite 是一个cookie属性,限制了浏览器在跨站请求时是否会携带cookie。它可以帮助防止CSRF攻击,因为浏览器在发起跨站请求时不会自动携带cookie,从而阻止了攻击者伪造请求。
10.实现方式:将cookie的SameSite属性设置为Strict或Lax,可以防止浏览器在跨站请求时自动附带cookie。
例如:
Set-Cookie: session_id=abc123; SameSite=Strict; Secure; HttpOnly;
11.SameSite=Strict:完全阻止跨站请求发送cookie。
12.SameSite=Lax:允许一些类型的跨站请求(例如GET请求),但阻止复杂的跨站请求(例如POST请求)。
3. Referer Header检查
13.原理:通过检查请求头中的 Referer 或 Origin 字段,来确认请求是否来自合法的源站。合法的请求应该来自同一个域名。如果请求头中的Referer或Origin字段为空或者与期望的源站不匹配,则可以判定该请求为潜在的CSRF攻击。
14.实现方式:服务器可以根据请求的Referer和Origin字段来验证请求来源,拒绝不符合的请求。
例如,服务器检查 Referer:
if (request.headers['referer'] !== 'https://example.com') {
return res.status(403).send('Forbidden');
}
4. 双重认证(Two-Factor Authentication)
15.原理:通过增加额外的身份验证步骤,例如要求用户输入验证码或手机短信验证码,在重要操作(如转账、密码更改等)时,进一步提高安全性,防止CSRF攻击。
16.实现方式:在敏感操作时,要求用户输入验证码、短信或其他第二种验证信息,以确认操作是由用户本人发起的。
5. 避免 GET 请求修改数据
17.原理:根据HTTP规范,GET请求应该是幂等的,不应该用于修改服务器状态。所有修改数据的操作应使用POST、PUT、PATCH等方法,而GET请求应该仅用于获取资源。
18.实现方式:确保所有可能导致数据修改的请求都使用POST方法,并且不依赖GET请求来提交表单或执行操作。
6. 用户行为确认
19.原理:某些情况下,可以通过要求用户再次确认他们的意图来避免恶意操作,例如,在重要操作(如转账、删除账户)时要求用户再次输入密码或通过其他方式确认。
20.实现方式:要求用户再次确认操作或提供额外的身份验证信息。
总结
CSRF是通过冒充合法用户发起恶意请求的攻击方式,主要依赖于受害者的浏览器自动携带身份认证信息(如cookie)发送请求。为了防止CSRF攻击,可以采用以下几种策略:
21.使用CSRF Token:为每个请求生成唯一的token,确保请求是合法用户发起的。
22.使用SameSite Cookies:通过限制cookie的发送范围,避免跨站请求伪造。
23.Referer/Origin头检查:通过检查请求的来源,确认请求是否来自合法的站点。
24.双重认证:增加额外的身份验证步骤,防止未授权操作。
25.避免GET请求修改数据:将所有可能修改服务器状态的请求限制为POST请求。
26.用户行为确认:通过额外的确认步骤确保操作是由用户本人发起的。
这些措施能够有效地防止CSRF攻击,保护用户数据安全。
相关文章:
CSRF 跨站请求伪造的实现原理和预防措施
CSRF(跨站请求伪造)概述 CSRF(Cross-Site Request Forgery),即跨站请求伪造,是一种攻击手段,攻击者利用受害者在网站上已认证的身份信息,诱使受害者发起未经授权的请求,从…...
【LeetCode】【算法】22. 括号生成
LeetCode 22. 括号生成 题目描述 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 解题思路 天天到处看答案,看的灵神的解题思路回溯不会写?套路在此!(Pyth…...
WPF+MVVM案例实战与特效(二十五)- 3D粒子波浪效果实现
文章目录 1、案例效果2、案例实现1、文件创建2. 功能代码实现3、粒子功能应用1、前端布局与样式2、代码解释2、 后端功能代码1、案例效果 2、案例实现 1、文件创建 打开 Wpf_Examples 项目、Models 文件夹下创建 3D粒子模型类 ParticleWaveEffectModel.cs 文件。在Tools 文件…...
wsl2安装和使用
WSL(Windows Subsystem for Linux)是一个在 Windows 操作系统上运行 Linux 二进制可执行文件的兼容层。它允许用户在 Windows 上运行 Linux 命令行工具和应用程序。 主要功能 简化开发流程:开发者可以在 Windows 上使用 Linux 的开发工具链。兼容性:支持多种 Linux 发行版,…...
【划分型 DP-最优划分】【腾讯笔试压轴】【hard】力扣132. 分割回文串 II
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。 返回符合要求的 最少分割次数 。 示例 1: 输入:s “aab” 输出:1 解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子…...
Kubernetes-镜像加速篇-01-加速工具
[友情链接]加速三剑客 镜像加速:https://github.com/DaoCloud/public-image-mirror 二进制文件加速:https://github.com/DaoCloud/public-binary-files-mirror Helm 加速:https://github.com/DaoCloud/public-helm-charts-mirror 二进制文件…...
字母的异位数
做leetcode242题时出现了一个错误: bool isAnagram(string s, string t) {map<char,int> cnt;bool ans true;int lens s.length();int lent t.length();for(int i 0;i < lens;i){cnt[s[i]] 1;cout << cnt[s[i]] << endl;}for(int i 0;i…...
达梦数据库DM Exception字符串截断错误,略坑~
前言 我之前在使用达梦数据库的时候,遇到了很多很多的问题,主要对达梦数据库也不是很熟悉,它的语法和我所熟悉的mysql和postgresql有很大的区别。 今天,讲一下我之前遇到的一个问题。这个问题的起因是用达梦数据库迁移工具&…...
vue实现图片无限滚动播放
本人vue新手菜鸡,文章为自己在项目中遇到问题的记录,如有不足还请大佬指正 文章目录 实现效果代码展示总结 因为刚接触vue,本想着看看能不能用一些element的组件实现图片的轮播效果,尝试使用过element-UI里的走马灯Carouse&#x…...
python爬虫指南——初学者避坑篇
目录 Python爬虫初学者学习指南一、学习方向二、Python爬虫知识点总结三、具体知识点详解和实现步骤1. HTTP请求和HTML解析2. 正则表达式提取数据3. 动态内容爬取4. 数据存储5. 反爬虫应对措施 四、完整案例:爬取京东商品信息1. 导入库和设置基本信息2. 获取网页内容…...
Vivado+Vscode联合打造verilog环境
一、Vivado下载安装 详细参考我另一篇文章: Vivado2022.2下载安装_fpga vivado下载-CSDN博客https://blog.csdn.net/weixin_61081689/article/details/143460790?spm1001.2014.3001.5501 二、Vscode下载安装 详细参考我另一篇文章: VscodeAnacond…...
Python 微服务架构
Python 微服务架构 目录 🛠 微服务架构的基本概念与设计原则⚡ Python 在微服务中的应用(Flask、FastAPI等框架)🚀 微服务的自动化部署与运维🔍 服务发现与负载均衡📊 微服务中的日志集中管理与监控&…...
Android JNI 技术入门指南
引言 在Android开发中,Java是一种主要的编程语言,然而,对于一些性能要求较高的场景(如音视频处理、图像处理、计算密集型任务等),我们可能需要使用到C或C等语言来编写底层的高效代码。为了实现Java代码与C…...
实在智能受邀出席柳州市智能终端及机器人产业发展合作大会
10 月 27 日至 28 日,由中共柳州市委员会与柳州市人民政府主办的2024柳州市智能终端及机器人产业发展合作大会在柳州莲花山庄隆重举行。大会充分整合各方资源,持续深化与柳州在重大战略规划、重大平台建设、重点产业培育等领域的合作。作为智能体行业的知…...
算法求解(C#)-- 寻找包含目标字符串的最短子串算法
1. 引言 在字符串处理中,我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…...
AscendC从入门到精通系列(二)基于Kernel直调开发AscendC算子
本次主要讨论下AscendC算子的开发流程,基于Kernel直调工程的算子开发。 1 AscendC算子开发的基本流程 使用Ascend C完成Add算子核函数开发; 使用ICPU_RUN_KF CPU调测宏完成算子核函数CPU侧运行验证; 使用<<<>>>内核调用符…...
DAO模式的理解
目录 DAO模式 含义 DAO模式 的理解 分层思维 分层含义 分层目的 dao层 dao包(对接的是操作数据库的接口) dao包下lmpl 包(dao包中接口的实现类) 补充 1 你创建的实体类需要和数据库中建的表一一对应。 总结 DAO模式 含义…...
使用GitHub Actions实现CI/CD流程
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用GitHub Actions实现CI/CD流程 GitHub Actions 简介 创建仓库 配置工作流 示例工作流文件 触发和运行工作流 部署应用 最佳实…...
机器人助力Bridge Champ游戏:1.4.2版本如何提升玩家体验
在Bridge Champ游戏中,机器人扮演着桥牌游戏的“无名英雄”角色,默默地提升玩家体验。凭借智能化的设计,这些机器人不仅能够陪练,也大大提升了比赛的流畅度与趣味性。 Bridge Champ是什么 Bridge Champ是一个基于Ignis公链的在线…...
滑动窗口(单调队列维护窗口)-acwing
题目: 154. 滑动窗口 - AcWing题库 代码(删除队列窗口多余的>单调队列) 判断最值是否滑出窗口可以放在 入队的后面。 但是,判断,准备入队元素比前面小,要从队尾出队,放在入队前。 总之&a…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
