Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >保护行动链接不受CSRF影响的最佳方法

保护行动链接不受CSRF影响的最佳方法
EN

Software Engineering用户
提问于 2023-05-30 08:24:26
回答 2查看 74关注 0票数 1

应用程序具有多因素登录。用户登录其电子邮件和密码,然后以下屏幕询问一个通过电子邮件接收或由移动应用程序生成的一次性密码。

在第二个屏幕中,还有一个名为"cancel登录“的链接,指向例如/login/cancel。用户可以单击此按钮取消登录进程,进程的会话/cookie将被清除,您将不得不重新开始。

我的问题是关于这种“行动”的链接。单击它实际上会发送一个GET请求,但不仅仅是为了显示页面或检索数据,而是为了在应用程序中执行一个操作。在实践中,另一个网站可能包含一个链接,甚至一个图片,指向我们的应用程序的“登录取消网址”,并注销未知的用户。简单地说,是CSRF的攻击。

我使用Laravel框架,并对html表单使用内置的CSRF保护。但是,我想知道如何正确地实现GET请求的这种保护。将查询参数添加到操作链接的url,然后手动验证包含的CSRF令牌是否就足够了?另外,我想知道在web应用程序中使用链接来执行操作是否可以接受。它工作得很好,但是GET请求在语义上不是用来“说/执行”的。另一种选择是,我不使用链接,而是使用一个小表单,它包含一个隐藏的CSRF令牌字段和一个提交按钮,该按钮充当(并被设计为)链接。然后使用POST请求发送表单。什么是最佳实践,是否有任何安全指南?

EN

回答 2

Software Engineering用户

发布于 2023-05-30 13:19:47

你几乎回答了你自己的问题,只需使用带有CSRF保护的表单。GET url更容易被恶意方滥用(通过链接和图像等)。但是CSRF的保护也同样有效,我相信Laravel会支持这一点。

或者,您可以对链接进行签名,并拒绝对url的任何没有有效签名的请求。

票数 2
EN

Software Engineering用户

发布于 2023-05-31 18:56:28

通过正确使用cookie和查询字符串参数,您可以模拟许多CSRF缓解策略使用的内容。在深入研究cookies的安全之前,这就是这个过程所需要的:

  1. 使用加密的随机值( CSRF令牌)设置cookie。将其标记为HttpOnly、Secure和SameSite。当你这么做的时候,这取决于你自己。也许在登录的时候。
  2. 将CSRF令牌放在查询字符串中的注销页面中。
  3. 单击注销链接后,浏览器发送两个此令牌的副本:一个在查询字符串中,另一个作为cookie。
  4. 在执行注销逻辑之前,比较这两个令牌。只有当令牌匹配时,才能执行注销逻辑。如果令牌不匹配,或者其中之一丢失,则使用400 Bad Request响应。

只有在正确设置cookie的情况下,才能防止CSRF攻击。当第一次设置cookie时,服务器应该响应如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTTP/1.1 200 OK
...
Set-Cookie: CSRF=abc123; expires=date; Domain=example.com; Path=XXX; HttpOnly; Secure; SameSite
...

<DOCTYPE HTML>
<html>

有关更多信息的MDN

注销的URL将类似于https://example.com/logout?CSRF=abc123

单击此链接将发送类似于以下内容的HTTP请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /logout?CSRF=abc123 http/1.1
...
Cookie: CSRF=abc123
...

由于cookie标记为HttpOnly,JavaScript无法访问cookie,因此恶意脚本无法读取cookie并将其发送到某个地方供以后使用。cookie上的SameSite属性意味着浏览器将根本不会发送cookie,除非页面是从相同的来源(协议+主机+端口)加载的-参见同一原产地政策。这防止了作为脚本标签嵌入到某个黑客网站上的驱动程序请求。想象一下其他一些网站在其源代码中嵌入了这样的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script src="https://example.com/logout?CSRF=abc123"></script>

浏览器会很高兴地提出这个请求,但是即使攻击者猜到了CSRF令牌,也不会发送CSRF cookie。由于没有发送cookie,您的服务器将使用400 Bad Request进行响应。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/445796

复制
相关文章
指针和引用的区别是什么
注意,C++ 标准并没有明确要求编译器该如何实现引用,但是基本上所有编译器在底层处理上都会把引用当作指针来处理。比如下面是一个引用,
ClearSeve
2022/02/10
3860
ElementRef & TemplateRef & ViewContainerRef
今天在做ng项目,看着前人的代码有 viewChild() 等关键字。新手有点疑惑,索性查查资料总结一下和ng相关的几个和DOM相关的几个概念
用户2436820
2018/09/05
1.2K0
微服务架构下的服务发布和引用方案
服务提供者如何发布一个服务? 服务消费者如何引用这个服务? 具体来说,就是这个服务的接口名是什么? 调用这个服务需要传递哪些参数? 接口的返回值是什么类型?
JavaEdge
2021/02/23
4820
微服务架构下的服务发布和引用方案
js如何引用同级元素
https://coder.itclan.cn/fontend/js/17-yinyong-tongji-elem/
itclanCoder
2023/02/26
7.9K0
js如何引用同级元素
DOM节点和元素之间的区别是什么?
文档对象模型(DOM)是将 HTML 或 XML 文档视为树结构的接口,其中每个节点(node)都是文档的对象。DOM 还提供了一组用于查询树、修改结构和样式的方法。
疯狂的技术宅
2021/01/28
2.4K0
Angular 动态创建组件
上面代码中,我们定义了一个简单的 AlertComponent 组件,该组件有一个输入属性 type ,用于让用户自定义提示的类型,此外还包含了一个输出属性 output,用于向外部组件输出信息。我们的自定义组件最终是一个实际的 DOM 元素,因此如果我们需要在页面中插入该元素,我们就需要考虑在哪里放置该元素。
阿宝哥
2019/11/05
3.7K0
软引用和弱引用的区别_强引用软引用弱引用虚引用的区别
第一次GC的时候,软引用没有被回收,是因为这时候内存资源充足。第二次由于分配了较大的内存,导致GC,这时候由于内存资源紧张,软引用被回收了,也就是虽然User对象有一个软引用在引用着它,但User对象在此条件下也会被GC回收。所以软引用的对象在一定条件下可被回收,故软引用对象不会导致内存溢出。
全栈程序员站长
2022/10/04
1.2K0
Dubbo——服务引用
上一篇我们分析了服务发布的原理,可以看到默认是创建了一个Netty server,并通过Invoker调用服务,同样,在客户端也会创建一个Inovker对象,下面就一起来看看这个引用创建过程。
夜勿语
2020/09/07
4350
python序列元素引用容易出错的地方
  python序列分列表和元组,不同之处在于元组的元素不能修改。元组使用小括号,列表使用方括号。元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。举个简单的例子,a1是一个元组,a2是一个列表
ytkah
2022/03/14
4340
2. 源码分析---SOFARPC客户端服务引用
这里返回的consumerBootstrap和用的启动器和协议有关,如果用的是bolt那么返回的就是BoltConsumerBootstrap实例。
luozhiyun
2019/09/10
5270
Angular DOM 抽象概述
为了能够支持跨平台,Angular 通过抽象层封装了不同平台的差异,统一了 API 接口。如定义了抽象类 Renderer2 、抽象类 RootRenderer 等。此外还定义了以下引用类型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。
阿宝哥
2019/11/05
3.6K0
Dubbo的服务引用过程
上篇文章我们已经了解了 Dubbo 服务暴露全过程,这篇文章我就带着大家再来看看 Dubbo 服务引入全流程,这篇服务引入写完下一篇就要来个全链路打通了,看看大家看完会不会有种任督二脉都被打通的感觉。
用户1263954
2022/04/07
2130
Dubbo的服务引用过程
Angular2 之 结构型指令几个概念
两种用法。(* 与 template) 控制宿主元素的模板。 在哪里去显示,viewcontain 怎么注入,属性的set语法的使用,是便捷的监听属性值变化的途径。
贺贺V5
2018/08/21
3K0
Angular2 之 结构型指令几个概念
HTML的行元素和块元素
本博客所有文章如无特别注明均为原创。作者:十月梦想 ,复制或转载请以超链接形式注明转自 十月梦想博客 。 原文地址《HTML的行元素和块元素》
十月梦想
2018/08/29
3.3K0
07-2 引用
二、引用(控制扩展) 现在我们已经知道,shell 有多种方式可以进行扩展,现在我们来学习如何控制扩展。 echo this is a test echo The tota is $100.0
见贤思齊
2020/08/05
7070
【DUBBO】 服务引用RegistryDirectory
实现了FactoryBean接口,所以在获取实例的时候,实际上是调用getObject方法返回实例。这里面的get方法继承自ReferenceConfig类
spilledyear
2018/12/24
8350
PHP的引用计数是什么意思?
在PHP的数据结构中,引用计数就是指每一个变量,除了保存了它们的类型和值之外,还额外保存了两个内容,一个是当前这个变量是否被引用,另一个是引用的次数。为什么要多保存这样两个内容呢?当然是为了垃圾回收(GC)。也就是说,当引用次数为0的时候,这个变量就没有再被使用了,就可以通过 GC 来进行回收,释放占用的内存资源。任何程序都不能无限制的一直占用着内存资源,过大的内存占用往往会带来一个严重的问题,那就是内存泄露,而 GC 就是PHP底层自动帮我们完成了内存的销毁,而不用像 C 一样必须去手动地 free 。
硬核项目经理
2020/07/14
2.2K0
OpenCV中检测ChArUco的角点(2)
ArUCo标记板是非常有用的,因为他们的快速检测和多功能性。然而,ArUco标记的一个问题是,即使在应用亚像素细化后,其角点位置的精度也不太高。相反,棋盘图案的角点可以更精确地细化,因为每个角点被两个黑色正方形包围。然而,寻找棋盘图案并不像寻找aruco棋盘那样通用:它必须是完全可见的,并且不允许遮挡。
点云PCL博主
2022/02/10
2.9K0
OpenCV中检测ChArUco的角点(2)
nodejs的引用和导出
正如我们想的那样,nodejs每次只能运行一个js脚本,所以如果想运行多个js脚本可以采用引用(require)的方式
是小张啊喂
2021/08/10
7320
【说站】javascript引用类型是什么
1、引用类型有Object:Array、Function、Date、RegExp等。
很酷的站长
2022/11/23
4520

相似问题

TemplateRef和ViewContainerRef是什么?

13

用ViewContainerRef实现角2误差

11

角viewContainerRef of ViewRef

115

角2理解ViewContainerRef与TemplateRef的用法

11

角指令ViewContainerRef测试模

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文