如何防御跨站请求伪造(CSRF)攻击?

71dba57e115b75748019ce39b9231131.png

CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”,是指恶意诱导用户打开被精心构造的网站,在该网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF 就是利用了用户的登录状态,并通过被精心构造的网站利用用户正常网站的会话状态来做用户不知情的事情。

用GET请求

特别典型的目前少见。一个变体我就遇到过:我不小心登录了一个游戏网站,游戏网站不断给我弹出图片要我充钱。我点击关闭,但是这个点击动作触发了一个操作

<img src=http://www.手机话费.com/transfer?to=恶意游戏网站&money=100>

扣了我的话费。这个没有经过我的允许。我懂得维权,于是打电话给运营商:电信、移动或者联通。找客服把话费要回来了。客服说这是我自己的操作,但是为了提高用户体验,还是把话费退给我。客服这么说到底是知道那个平台是有问题的,影响了客户权益,怕影响声誉不肯承认;还是为了解决问题不得而知,但运营商的这个接口是有问题。

我回忆了一下,当时是怎么回事。模糊的记得,注册时用的是手机号验证码自动注册登录。很可能是这时候登录了运营商的网站,当时没有太在意页面是哪个网站的。这个游戏网站用了运营商存储在客户端的cookie信息,向运营商发起伪造请求。这个问题很好解决,对于话费扣除这样重要的接口,运营商不应该用GET请求,用POST并且要求一些信息数据。增加伪造成本。

SameSite属性

上面的场景,我并不确定当时的请求是GET请求,因为毕竟在手机上也没想到看源码。如果运营商那边还没有那么降智,游戏那边花了些力气,模拟表单提交POST请求,怎么来解决呢?

模拟请求的原理是截获了客户端的cookie,Chrome 51 开始,浏览器的 Cookie 新增加了一个SameSite属性,用来防止 CSRF 攻击和用户追踪。它可以设置三个值。

Strict:完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。这个规则过于严格,可能造成非常不好的用户体验。比如,当前网页有一个 GitHub 链接,用户点击跳转就不会带有 GitHub 的 Cookie,跳转过去总是未登陆状态。

Lax:规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外。

e368cb5e8fbe1c904f840cabe33c7146.png

None:网站可以选择显式关闭SameSite属性,将其设为None。前提是必须同时设置Secure属性(Cookie 只能通过 HTTPS 协议发送),否则无效。

Set-Cookie: widget_session=abc123; SameSite=None; Secure

SameSite属性防止攻击的方法,提前是浏览器要支持。服务端还是需要对自己的接口负责。有下面几种方式:

标志请求来源

限制 HTTP 请求头中的 Referer 字段,这个值将在浏览器页面上发起请求时被主动添加,用于指定请求的来源页面。作为网站开发者,我们限制 Referer 请求头,仅允许它来自我们已知的正常地址,而阻止恶意请求。

CSRF Token


服务端生成一个token,浏览器接收到这个Token后存储在本地存储中,提交表单时,会将这个token再传回服务端作比较,比较一致才可以执行。

提交验证码

在表单中增加一个随机的数字或字母验证码,通过强制用户和应用进行交互,来有效地遏制CSRF攻击。

在 HTTP 头中自定义属性并验证

这种方法也是使用 token 并进行验证,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。

同域安全策略

CORS,全称Cross-Origin Resource Sharing,是一种允许当前域(domain)的资源被其他域(domain)的脚本请求访问的机制,通常由于同域安全策略(the same-origin security policy)浏览器会禁止这种跨域请求。

792d87befb1757eb67d95635dd1380ff.png

对于简单请求,浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段。Origin字段用来说明,本次请求来自哪个源(协议+域名+端口)。服务器根据这个值,决定是否同意这次请求。不在许可范围内:正常的HTTP回应,响应头不会添加Access-Control-Allow-Origin。origin在许可范围内,响应头会添加Access-Control-xx。

Access-Control-Allow-Origin: http://brmayi.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。

非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的请求,否则就报错。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WordPress建站入门教程:如何在本地电脑搭建WordPress网站?

前面跟大家分享了『WordPress建站入门教程&#xff1a;如何安装本地WordPress网站运行环境&#xff1f;』&#xff0c;接下来boke112百科就继续跟大家分享本地电脑如何搭建WordPress网站。 小皮面板&#xff08;phpstudy&#xff09;的“软件管理 – 网站程序”虽然可以一键部…

excel统计分析——拉丁方设计

参考资料&#xff1a;生物统计学 拉丁方设计也是随机区组设计&#xff0c;是对随机区组设计的一种改进。它在行的方向和列的方向都可以看成区组&#xff0c;因此能实现双向误差的控制。在一般的试验设计中&#xff0c;拉丁方常被看作双区组设计&#xff0c;用于提高发现处理效应…

身份证识别系统(安卓)

设计内容与要求&#xff1a; 通过手机摄像头捕获身份证信息&#xff0c;将身份证上的姓名、性别、出生年月、身份证号码保存在数据库中。1&#xff09;所开发Apps软件至少需由3-5个以上功能性界面组成。要求&#xff1a;界面美观整洁、方便应用&#xff1b;可以使用Android原生…

徽标键锁定问题

徽标键锁定问题 1. 锁定徽标键2. 解锁徽标键 无意中发现键盘除了左右徽标键&#xff0c;其余键都正常。相关的组合键也都失效。 自己的键盘是ikbc w210款的键盘。一直使用都没有任何问题。 搜索发现使用 Fn和 徽标键组合就能锁定和解锁 徽标键。 1. 锁定徽标键 左徽标键Fn …

[项目设计] 从零实现的高并发内存池(一)

&#x1f308; 博客个人主页&#xff1a;Chris在Coding &#x1f3a5; 本文所属专栏&#xff1a;[高并发内存池] ❤️ 前置学习专栏&#xff1a;[Linux学习] ⏰ 我们仍在旅途 ​ 目录 前言 项目介绍 1.内存池 1.1 什么是内存池 池化技术 内存池 1.2 为什…

思科网络设备监控

思科是 IT 行业的先驱之一&#xff0c;提供从交换机到刀片服务器的各种设备&#xff0c;以满足中小企业和企业的各种 IT 管理需求。管理充满思科的 IT 车间涉及许多管理挑战&#xff0c;例如监控可用性和性能、管理配置更改、存档防火墙日志、排除带宽问题等等&#xff0c;这需…

区块链媒体发布推广10个热门案例解析-华媒舍

区块链技术的发展已经引起了媒体的广泛关注&#xff0c;越来越多的区块链媒体纷纷发布推广相关的热门案例。本文将介绍10个成功的区块链媒体推广案例&#xff0c;并分享它们的成功秘诀&#xff0c;帮助读者更好地了解区块链媒体推广的方法与技巧。 随着区块链技术的成熟和应用场…

常用的电阻、电容的种类和应用场合?

电阻的 a.按阻值特性:固定电阻、可调电阻、特种电阻(敏感电阻)&#xff0c;不能调节的,我们称之为固定电阻,而可以调节的,我们称之为可调电阻.常见的例如收音机音量调节的,主要应用于电压分配的,我们称之为电位器. b.按制造材料:碳膜电阻、金属膜电阻、线绕电阻&#xff0c;捷…

Qt/C++音视频开发67-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流

一、前言 音视频组件除了支持保存MP4文件外&#xff0c;同时还支持保存裸流即264/265文件&#xff0c;以及解码后最原始的yuv文件。在实际使用过程中&#xff0c;会发现部分视频文件保存的裸流文件&#xff0c;并不能直接用播放器播放&#xff0c;查阅资料得知原来是缺少sps/p…

2023年,我的年终总结

序言 2023年的年终总结一直拖到现在&#xff0c;想来是有多个原因吧&#xff1a;第一个应该是年底还有些事情没有完成&#xff0c;内心有所不甘&#xff1b;第二个应该是这一年似乎是很忙碌的一年&#xff0c;不知从何说起&#xff1b;第三个应该是对于自己这一年的收获&#…

Learning from Unlabeled 3D Environments forVision-and-Language Navigation

这篇论文是关于高级指令的 摘要 在视觉和语言导航 (VLN) 中&#xff0c;实体代理需要按照自然语言指令在真实的 3D 环境中进行导航。现有 VLN 方法的一个主要瓶颈是缺乏足够的训练数据&#xff0c;导致对未见过的环境的泛化效果不理想。虽然 VLN 数据通常是手动收集的&#x…

动态SQL的处理

学习视频&#xff1a;3001 动态SQL中的元素_哔哩哔哩_bilibili 目录 1.1为什么学 1.2动态SQL中的元素 条件查询操作 if 元素 choose、when、otherwise元素 where、trim元素 更新操作 set元素使用场景 复杂查询操作 foreach 元素中的属性 ​编辑 迭代数组 迭代List 迭代Map 1…

RocketMQ - 深入研究一下Broker是如何持久化存储消息的

1. CommitLog消息顺序写入机制 首先思考一下,当生产者的消息发送到一个Broker上的时候,他接收到了一条消息,接着他会对这个消息做什么事情? 首先第一步,他会把整个消息直接写入磁盘上的一个日志文件,叫做CommitLog,直接顺序写入这个文件,如下图: 这个CommitLog是很…

Python用类实现抽象和封装

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 路在脚下&#xff0c;勇往直前&#x…

mac报错:zsh: command not found: npm

1、问题概述&#xff1f; 在mac系统中使用npm命令的时候&#xff0c;mac os报错提示&#xff1a; zsh: command not found: npm 一般出现发这种情况的原因时没有安装npm,而npm这命令时集成在nodejs中的&#xff0c;所以安装nodejs就可以了。 2、解决办法 本质就是需要安装…

Day13:信息打点-JS架构框架识别泄漏提取API接口枚举FUZZ爬虫插件项目

目录 JS前端架构-识别&分析 JS前端架构-开发框架分析 前端架构-半自动Burp分析 前端架构-自动化项目分析 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/数据库/系统/WAF等 系统&#xff1a;操作系统/端口服务/网络环境/防火墙等 应用&#xff1a;APP对象/API接…

聊一聊Python量化交易

在金融领域&#xff0c;量化交易已经成为一种越来越受欢迎的交易方式。它通过使用数学模型来分析市场&#xff0c;自动化执行交易决策&#xff0c;以此来获取超额回报。近年来&#xff0c;Python因其简洁易学、功能强大而成为量化交易领域的首选编程语言。本文将详细介绍Python…

Vue 前端开发 v-for和v-if两个指令不能混合使用

原由&#xff1a; 在进行项目开发的时候因为在一个标签上同时使用了v-for和v-if两个指令导致的报错。 提示错误&#xff1a;The undefined variable inside v-for directive should be replaced with a computed property that returns filtered array instead. You should no…

NOC2023软件创意编程(学而思赛道)python初中组初赛真题

软件创意编程 一、参赛范围 1.参赛组别:小学低年级组(1-3 年级)、小学高年级组(4-6 年级)、初中组。 2.参赛人数:1 人。 3.指导教师:1 人(可空缺)。 4.每人限参加 1 个赛项。 组别确定:以地方教育行政主管部门(教委、教育厅、教育局) 认定的选手所属学段为准。 二、…

【新书推荐】11.1 子程序设计

第十一章 子程序及参数传递 本章先讲述子程序设计的方法&#xff0c;然后介绍在子程序调用中参数的四种传递方法。 11.1 子程序设计 在前面的示例和练习中&#xff0c;会发现程序中会有一些反复使用到的代码片段。我们将程序中反复出现的程序片段设计成子程序&#xff0c;这样…
最新文章