每个请求的 XSRF 令牌如何工作?(角度解决方案)

信息安全 Web应用程序 csrf
2021-09-01 17:29:14

我想保护我的应用程序免受 XSRF 的影响。虽然我不能真正理解问题是什么以及我的解决方案是如何工作的,但经过一些研究,我想出了一个解决方案,Angular 使用了这个解决方案。据我所知,我的解决方案需要以下步骤:

  • 客户发送我的 SPA 请求。
  • 我发送 XSRF 令牌(不是仅 HTTP,以便 JS 能够读取它)。我还将这个 XSRF 令牌保存到服务器上的用户会话中。
  • 对于每个 POST 请求,我希望我的客户端读取 XSRF 令牌并X-XSRF-TOKEN为此令牌设置标头。
  • 我将通过检查请求标头和用户会话 XSRF 令牌是否匹配来检查每个请求。如果他们这样做,如果需要,我还将检查 JWT 进行身份验证。
  • 验证 XSRF 令牌后,我将对数据库进行更改。此外,我将再次更改 XSRF-token,并将新令牌发送给用户,并更改会话的令牌。

但如果我有 XSS 漏洞,我不确定这有什么帮助,因为任何注入的 JavaScript 代码也可以这样做。我想了解这个问题以及这样的解决方案如何提供帮助。

仅供参考,我还在 Express 服务器上实现基于 JWT 的身份验证,使用 Redis 进行会话管理。

1个回答

计划好不好?

你的计划在我看来不错。使用 CSRF 令牌是此类问题的标准解决方案。但是你不应该仅仅因为互联网上的一些陌生人告诉你它看起来不错而感到安全 - 确保你了解你在做什么以及为什么,否则你一定会犯错误。

(一个小问题:我不确定您是否需要在每次请求时更改令牌。)

那么它为什么起作用呢?

从我的这个旧答案

攻击者欺骗受害者访问http://evil.com包含自动执行 POST 的表单http://bank.com/transfer?to=evilHacker&amount=1000000如果受害者已经登录到她的银行,带有会话 ID 的 cookie 将像往常一样由浏览器发送,银行服务器无法知道受害者实际上并没有打算转账。请注意,这依赖于浏览器将带有会话 ID 的 cookie 发送到bank.com.

那么 CSRF 令牌如何提供帮助?如果bank.com始终检查请求中是否存在该会话唯一的随机令牌,evil.com则无法伪造请求,因为运行该站点的邪恶黑客不知道该令牌是什么。

但是 XSS 呢?

正如您在问题中所说,如果存在 XSS 漏洞,这将无济于事。事实上,在这种情况下,没有 CSRF 保护可以提供帮助,但是如果您容易受到 XSS 的攻击,那么您需要担心的问题比被盗的 CSRF 令牌更大。

因此,这里唯一要做的就是进行 XSS 保护。