- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这听起来像是一个愚蠢的问题。我想弄清楚这一点。如果 token 首先发送到客户端并且客户端发回相同的 token ,那么 csrf token 如何帮助识别跨站点请求?恶意客户端不会从服务器获得响应。
如果我们在发送 token 的同时检查来源,那么 token 检查的事情是不是显得多余?
我们如何确保服务器只会将 token 提供给授权的客户端,以及将 token 从服务器传输到客户端的最佳实践是什么?
我曾问过一个相关问题 here但需要更深入地了解它。所以在这里问一个不同的问题。
希望通过例子得到一些答案。
先感谢您
最佳答案
CSRF 基本上是关于攻击者通过 cookie 在浏览器中的工作方式利用用户现有 session 。潜在的问题是,无论请求来自何处(哪个来源,即域),cookie 都会随请求一起发送,唯一重要的是它去往何处。因此,如果有用户登录到应用程序(具有 session cookie),攻击者可能会尝试让该用户访问他的恶意网站,从那里攻击者可以使用用户的凭据向应用程序域发出请求(通过完全将用户发布到应用程序,或更巧妙地通过创建 ajax 请求)。
请注意,这仅适用于应用程序中的身份验证基于浏览器自动发送的内容时,最明显的是 session cookie,但例如基本的 http 身份验证或客户端证书身份验证也可能容易受到攻击。此外,CSRF 仅适用于更改某些内容(状态或数据)的请求。
有一件重要的事情在起作用,同源策略 (SOP) 是浏览器。稍微简化一下,这意味着如果从一个域(或更准确地说:源)下载某些内容,则另一个域将无法访问。
因此,为了防止上述攻击并防止攻击者在自己的域上让用户向用户登录的应用程序发送不需要的请求,可能有几种不同的策略。
同步器 token
应用程序生成一个 csrf token ,将其存储在用户的 session (服务器端)中,并将其发送到客户端,例如将其写入隐藏字段中的每种形式,或写入 Javascript 可以从中读取它的单个字段中并添加到请求中。这是有效的,因为他域中的攻击者无法使用用户 session 中的有效 token 创建表单或请求,并且攻击者也无法从应用程序页面读取 token 。当然,攻击者可以尝试下载申请表以获取 token ,但随后他将需要凭据。攻击者需要有效的用户 session 和相应的 csrf token 。攻击者可能有自己的适当帐户来登录,但无论如何他都可以执行操作。或者他可能有一个 csrf token ,但要么未经身份验证,要么使用较低权限的帐户。但他不能两者兼得,这就是重点。
因此,这种保护基本上可以验证请求是否来自合法应用程序实际呈现的源,而不是其他人。
请注意,在这种情况下,在 cookie 中设置 token 是没有意义的,因为 cookie 会像 session cookie 一样自动发送。
双重发布
另一种策略是生成 token ,并将其设置为客户端的 cookie。然后客户端从 cookie 中读取 token ,并将相同的 token 作为请求头发送。服务器只比较请求头和cookie是否包含相同的token。这是有效的,因为攻击者无法从不同来源设置的 cookie 中读取应用程序 token (参见上面的 SOP),但合法域上的应用程序可以。所以发送请求的客户端有效地证明它运行在合法的应用程序域上。这样做的好处是应用程序是无状态的,不需要 session 。缺点是它的安全性稍差。
(有趣的是,这种情况下的 token 甚至可以在客户端生成,它仍然有效,因为他自己域的攻击者无法设置或读取应用程序域的 cookie,但它绝对不那么安全,因为它是加密操作浏览器。)
检查引用者或来源
正如您正确指出的,另一种策略可能是检查请求的引用者或来源。它基本上有效,但被认为不太安全。虽然对于许多应用程序来说,双重发布被认为足够安全,但引用者/来源检查大多不是。我认为它具有很强的历史元素,但仍然不那么安全。
这个问题有很多方面,其中一些是浮现在脑海中的:
SameSite
cookie 的属性(除了已经存在且广泛使用的
httpOnly
和
secure
cookie 属性)。截至目前,它仅受 Chrome 支持,其他浏览器不支持。
关于security - 如何将CSRF token 从服务器传递到客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50732159/
Github:https://github.com/jjvang/PassIntentDemo 我一直在关注有关按 Intent 传递对象的教程:https://www.javacodegeeks.c
我有一个 View ,其中包含自动生成的 text 类型的 input 框。当我单击“通过电子邮件发送结果”按钮时,代码会将您带到 CalculatedResults Controller 中的 Em
我有一个基本的docker镜像,我将以此为基础构建自己的镜像。我没有基础镜像的Dockerfile。 基本上,基本镜像使用两个--env arg,一个接受其许可证,一个选择在容器中激活哪个框架。我可以
假设我想计算 2^n 的总和,n 范围从 0 到 100。我可以编写以下内容: seq { 0 .. 100 } |> Seq.sumBy ((**) 2I) 但是,这与 (*) 或其他运算符/函数不
我有这个网址: http://www.example.com/get_url.php?ID=100&Link=http://www.test.com/page.php?l=1&m=7 当我打印 $_G
我想将 window.URL.createObjectURL(file) 创建的地址传递给 dancer.js 但我得到 GET blob:http%3A//localhost/b847c5cd-aa
我想知道如何将 typedef 传递给函数。例如: typedef int box[3][3]; box empty, *board[3][3]; 我如何将 board 传递给函数?我
我正在将一些代码从我的 Controller 移动到核心数据应用程序中的模型。 我编写了一个方法,该方法为我定期发出的特定获取请求返回 NSManagedObjectID。 + (NSManagedO
为什么我不能将类型化数组传递到采用 any[] 的函数/构造函数中? typedArray = new MyType[ ... ]; items = new ko.observableArray(ty
我是一名新的 Web 开发人员,正在学习 html5 和 javascript。 我有一个带有“选项卡”的网页,可以使网页的某些部分消失并重新出现。 链接如下: HOME 和 JavaScript 函
我试图将对函数的引用作为参数传递 很难解释 我会写一些伪代码示例 (calling function) function(hello()); function(pass) { if this =
我在尝试调用我正在创建的 C# 项目中的函数时遇到以下错误: System.Runtime.InteropServices.COMException: Operation is not allowed
使用 ksh。尝试重用当前脚本而不修改它,基本上可以归结为如下内容: `expr 5 $1 $2` 如何将乘法命令 (*) 作为参数 $1 传递? 我首先尝试使用“*”,甚至是\*,但没有用。我尝试
我一直在研究“Play for Java”这本书,这本书非常棒。我对 Java 还是很陌生,但我一直在关注这些示例,我有点卡在第 3 章上了。可以在此处找到代码:Play for Java on Gi
我知道 Javascript 中的对象是通过引用复制/传递的。但是函数呢? 当我跳到一些令人困惑的地方时,我正在尝试这段代码。这是代码片段: x = function() { console.log(
我希望能够像这样传递参数: fn(a>=b) or fn(a!=b) 我在 DjangoORM 和 SQLAlchemy 中看到了这种行为,但我不知道如何实现它。 最佳答案 ORM 使用 specia
在我的 Angular 项目中,我最近将 rxjs 升级到版本 6。现在,来自 npm 的模块(在 node_modules 文件夹内)由于一些破坏性更改而失败(旧的进口不再有效)。我为我的代码调整了
这个问题在这里已经有了答案: The issue of * in Command line argument (6 个答案) 关闭 3 年前。 我正在编写一个关于反向波兰表示法的 C 程序,它通过命
$(document).ready(function() { function GetDeals() { alert($(this).attr("id")); } $('.filter
下面是一个例子: 复制代码 代码如下: use strict; #这里是两个数组 my @i =('1','2','3'); my @j =('a','b','c'); &n
我是一名优秀的程序员,十分优秀!