如何将CSRF令牌从服务器传递到客户端?

prms

这听起来像是一个愚蠢的问题。我想清楚这一点。如果先将令牌发送到客户端,然后客户端发回相同的令牌,csrf令牌如何帮助识别跨站点请求?恶意客户端不会从服务器获得响应。

如果我们在发送令牌时检查来源,那么令牌检查是否看起来多余?

我们如何确定服务器仅将令牌提供给授权的客户端,将令牌从服务器转移到客户端的最佳实践是什么?

我在这里问了一个相关的问题但是需要对此有更多的了解。所以在这里问一个不同的问题。

希望通过示例获得答案。

先感谢您

加伯·伦吉尔(Gabor Lengyel)

CSRF基本上是关于攻击者通过cookie在浏览器中的工作方式利用用户的现有会话。根本的问题是,一个cookie与请求一起发送的地方(其起源,即域)的请求到来时,无论,唯一的事情才是最重要的是它去因此,如果有用户登录到应用程序(具有会话cookie),则攻击者可能会试图诱使该用户访问其恶意网站,攻击者可以在该网站上使用用户的凭据(通过完全访问)向应用程序域发出请求。将用户发布到应用程序,或者通过创建ajax请求更巧妙地将其发布。

请注意,这仅在应用程序中的身份验证基于浏览器自动发送的内容(最明显的是会话cookie)的情况下适用,但是例如基本的http身份验证或客户端证书身份验证也可能受到攻击。CSRF也仅适用于更改某些内容(状态或数据)的请求。

有一件重要的事情起作用,浏览器使用相同的原始策略(SOP)。稍微简化一下,这意味着如果从一个域(或更确切地说是源)下载了某些内容,则另一个域将无权访问。

因此,为了防止上述攻击并防止其域上的攻击者使用户向用户登录的应用程序发送不需要的请求,可能有几种不同的策略。

同步器令牌

该应用程序生成一个csrf令牌,将其存储在用户会话(服务器端)中,并将其发送给客户端,例如,将其以每种形式写在一个隐藏字段中,或在一个可以从Javascript读取该字段的单个字段中进行编写并添加到请求中。之所以有效,是因为其域上的攻击者无法使用用户会话中的有效令牌创建表单或请求,并且攻击者也无法从应用程序页面读取令牌。当然,攻击者可以尝试下载应用程序表单以获取令牌,但随后他将需要凭据。攻击者需要有效的用户会话和相应的csrf令牌。攻击者可能拥有自己的适当帐户登录,但是无论如何,他仍然可以执行该操作。或者他可能有一个csrf令牌,但是未经身份验证,或较低特权帐户。但是他不能同时拥有两者,这就是重点。

因此,此保护基本上可以验证该请求是否来自合法应用程序实际提供的源,而不是其他人。

请注意,在这种情况下,在cookie中设置令牌是没有意义的,因为cookie会像会话cookie一样自动发送。

双重过帐

另一种策略是生成令牌,并将其设置为客户端的cookie。然后,客户端从cookie中读取令牌,并发送与请求标头相同的令牌。服务器仅比较请求标头和cookie是否包含相同的令牌。之所以可行,是因为攻击者无法从其他来源设置的cookie中读取应用程序令牌(请参阅上面的SOP),但是合法域上的应用程序可以。因此,发送请求的客户端有效地证明了该请求正在合法的应用程序域上运行。这样做的好处是应用程序是无状态的,不需要会话。缺点是它的安全性稍差。

(有趣的是,这种情况下的令牌甚至可以在客户端上生成,它仍然可以工作,因为他自己域上的攻击者无法设置或读取应用程序域cookie,但是由于它是加密操作,因此绝对安全性较低。浏览器。)

检查引荐来源

如您正确指出的,另一种策略可能是检查引用或请求的来源。它基本上可以工作,但被认为不太安全。尽管双重发布对于许多应用程序来说已足够安全,但引荐/来源检查通常不足够。还有就是它浓厚的历史元素,我认为,不过,它确实不太安全。

问题有很多方面,有些是我想到的:

  • 攻击者可以在自己的域上阻止发送引荐来源/来源标头因此,应用程序将不知道它是一个不同的域-它只是没有信息。您当然可以以需要引用和/或来源的方式来实现它,但这会导致潜在的错误和问题,因为某些原因浏览器不发送它。
  • 在某些情况下,引用者和来源可能是伪造的。例如,旧的易受攻击的浏览器插件(Java,Flash ...有人还记得Flash吗?)允许设置任何标头,攻击者只需要在受害者浏览器中安装其中之一即可,每个人都拥有它们。
  • 浏览器扩展程序还可以设置/修改标头,因此攻击者可能会尝试让受害者用户安装其恶意扩展程序。
  • 来源仅由现代浏览器设置。现在问题不大了,大多数人使用的浏览器同时设置了引荐来源和来源。

因此,由于这些原因,仅检查引用者/来源不是很可靠,因此应该设置另一层保护。

SameSite Cookie

一项新的发明由谷歌在Chrome是SameSite属性饼干(除了已经存在的和普遍的httpOnlysecurecookie的属性)。截至目前,Chrome仅支持此功能,而其他浏览器均不支持。

如上所述,潜在的问题是cookie(即会话cookie)是根据请求目标而不是源发送给服务器的。这意味着,如果Attacker.com将服务器页面发送给用户,并且该页面将浏览器中的发布请求发送到legitapp.com,则legitapp.com设置的任何cookie都会发送到legitapp.com。因此,如果它是登录到legitapp.com并访问Attacker.com的用户,则可以利用现有会话。

这由SameSite cookie属性更改,该属性使原始域与目标域不同时,在这种情况下不发送cookie。可以将其设置为'strict'或'lax',这基本上决定了GET请求的行为,但如果使用其中任何一项,都会阻止CSRF应用于非GET请求。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我如何将Java对象从服务器端传递到客户端

如何将jwt从swift客户端传递到node.js服务器

将Facebook访问令牌从移动客户端传递到服务器并进行处理

如何将字典项从客户端(Ajax)传递到服务器端(MVC API)

如何将变量从客户端传递到服务器端以设置 webchartcontol 宽度

将var从服务器传递到客户端

如何将Android客户端注册令牌发送到FCM服务器?

如何将 JSON 数据从服务器传递到客户端并在 Javascript 中使用数据?

如何安全地将Redux存储从服务器传递到客户端

Delphi EMS FireDAC:如何使用EMS将参数从客户端传递到服务器?

如何使用 AJAX 将图像从服务器传递到客户端 Flask

如何将响应作为 URL 从服务器检索到客户端

将身份验证令牌作为标头格式从客户端传递到远程服务器

将数据从客户端传递到服务器端

无法将客户端消息传递到服务器端

jhipster客户端将实体过滤器传递到服务器端?

将AD用户从客户端传递到IIS服务器再传递到DB服务器

如何将唯一标识符传递给SignalR客户端/服务器连接?

Cordova SAP Fiori客户端-如何将SSO令牌传递到FLP URL

在Play中,如何将js文件从ScalaJS客户端复制到服务器?

如何将值从 golang 发送到 vue js(服务器到客户端)?

NumberFormatException,同时将udp从客户端传递到服务器的数据转换为

使用Flask将JSON数据从服务器传递到客户端

流星将数据从客户端传递到服务器

将数组从NodeJS服务器传递到客户端?

NodeJS - 使用 ajax 将数组从客户端传递到服务器

是否可以将变量从客户端脚本传递到服务器脚本?

无法将值从服务器传递到客户端的Javascript不起作用

如何将变量从服务器端返回到客户端脚本?