反 CSRF 令牌在 SPA-API 通信中如何工作?

Nul*_*urt 5 csrf csrf-token

最近我正在研究一些 Web 安全基础知识,有一些东西我无法理解。\n反 CSRF 令牌在 SPA-API 通信中如何工作?

\n

据我了解,SPA-API通信中使用的反CSRF如下;

\n
    \n
  1. 浏览器向 API 发送登录请求。
  2. \n
  3. API 服务器生成一个令牌并将其发送回浏览器。
  4. \n
  5. 浏览器存储它,当浏览器发出下一个请求时,令牌会一起发送。
  6. \n
  7. API可以确保请求来自真实的前端,因为它包含令牌。
  8. \n
\n

我的脑海中浮现出一个问题——如何防止CSRF? \n如果令牌存储在cookie中,那么每当请求发生时,它就会自动发送到API,就像通常的会话cookie一样。即使它存储在其他存储中(例如会话存储或本地存储),也可以使用 JavaScript 进行访问。

\n

因此,一旦用户被攻击者的网站吸引,反 CSRF 令牌就完全没有用了。

\n

最重要的是,我无法理解反CSRF令牌和身份验证/授权\​​xe2\x80\xa6\xe2\x80\xa6中使用的常用cookie之间有什么区别

\n

也许我对反 CSRF 令牌的工作原理产生了严重的误解。请指出它出了什么问题。

\n

And*_*bie 4

当攻击者可以使用经过身份验证的用户的 cookie 向端点提交请求时,就会出现最常见的 CSRF 漏洞之一。如果您不使用 cookie(即验证用户的请求)或其他一些自动身份验证技术(如 HTTP 基本身份验证),那么通常不需要 CSRF 令牌。

示例#1

假设您使用的 REST API 依赖于访问令牌或不记名令牌进行身份验证。此令牌通常在 HTTP 授权标头(而不是 cookie)中提交。在这种情况下,只要身份验证不是自动的(例如,使用 cookie),就不需要 CSRF 令牌。

示例#2

在这种情况下,假设浏览器确实将会话 cookie 发送到 Web 服务/API 来验证请求。那么,是的,如果不实施反 CSRF 控制,您将很容易受到 CSRF 的影响。防止这种情况的一种方法是在加载 SPA 时向浏览器提供反 CSRF 令牌。然后,浏览器可以将该令牌与请求一起发送到端点。然后,Web 服务必须在收到请求时验证该令牌。

可以通过多种方式进行此验证。这可以使用双重提交 cookie、cookie 到标头令牌、加密技术甚至共享数据库来完成。

使用反 CSRF 令牌

反 CSRF 令牌通常不应存储在 cookie 中。正如OWASP CSRF 预防备忘单中所述:

CSRF 令牌可以包含在<meta>标签中。页面中的所有后续调用都可以从此<meta>标记中提取 CSRF 令牌。它还可以存储在 JavaScript 变量中或 DOM 上的任何位置。但是,不建议将其存储在cookie或浏览器本地存储中。

例如,反 CSRF 令牌可能会嵌入到页面中,如下所示:

<meta name="csrf-token" content="{{ csrf_token() }}">
Run Code Online (Sandbox Code Playgroud)

其中csrf_token()调用一些将令牌嵌入标签中的服务器端函数。

然后可以使用 JavaScript 读取它:

let csrf_token = document.querySelector("meta[name='csrf-token']").getAttribute("content");
Run Code Online (Sandbox Code Playgroud)

然后在发出 API 请求时传输到服务器(例如,在X-CSRF-TokenPOST 请求的标头中)。此外,令牌对于会话应该是唯一的。

但是,即使将令牌存储在 cookie 中,也可以使用HttpOnly标头设置 cookie。这可以防止 JavaScript 读取 cookie。这对于缓解跨站点脚本(XSS)攻击更加有用。

附加信息

一般而言,有关 CSRF 的其他好资源: