最近我正在研究一些 Web 安全基础知识,有一些东西我无法理解。\n反 CSRF 令牌在 SPA-API 通信中如何工作?
\n据我了解,SPA-API通信中使用的反CSRF如下;
\n我的脑海中浮现出一个问题——如何防止CSRF? \n如果令牌存储在cookie中,那么每当请求发生时,它就会自动发送到API,就像通常的会话cookie一样。即使它存储在其他存储中(例如会话存储或本地存储),也可以使用 JavaScript 进行访问。
\n因此,一旦用户被攻击者的网站吸引,反 CSRF 令牌就完全没有用了。
\n最重要的是,我无法理解反CSRF令牌和身份验证/授权\xe2\x80\xa6\xe2\x80\xa6中使用的常用cookie之间有什么区别
\n也许我对反 CSRF 令牌的工作原理产生了严重的误解。请指出它出了什么问题。
\n当攻击者可以使用经过身份验证的用户的 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 的其他好资源:
| 归档时间: |
|
| 查看次数: |
1091 次 |
| 最近记录: |