快速说明:尽管有一些重叠,但这不是带有自定义标头(并且没有验证令牌)的 CSRF 保护的副本。那篇文章讨论了如何在 Rest 端点上执行 CSRF 保护,而没有讨论它是否真的有必要。事实上,我在这个网站上读到的许多 CSRF/Rest 问题都在谈论通过 CSRF 令牌保护端点,而没有实际讨论是否有必要。因此这个问题。
Rest API 端点是否需要 CSRF 保护?
我已经看到很多关于保护 REST 端点免受 CSRF 攻击的讨论,但是在对这个话题进行了深思熟虑之后,我非常确定 REST 端点上的 CSRF 令牌可以提供零额外保护。因此,在 REST 端点上启用 CSRF 保护只会向您的应用程序引入一些无用的代码,我认为应该跳过它。我可能会遗漏一些东西,因此这个问题。我认为这将有助于记住为什么首先需要 CSRF 保护,以及它所保护的攻击向量:
为什么选择 CSRF?
它实际上归结为浏览器能够通过发送 cookie 自动为任何请求提供登录凭据。如果会话 ID 存储在 cookie 中,浏览器将自动将其与返回原始网站的所有请求一起发送。这意味着攻击者实际上不必知道身份验证详细信息即可作为受害者用户执行操作。相反,攻击者只需欺骗受害者浏览器发出请求,验证请求的凭据将免费。
输入 REST API
Rest API 端点与其他请求有一个非常重要的区别:它们特别是无状态的,并且永远不应该接受/使用来自 cookie 或会话的数据。因此,遵循标准的 REST API 会自动免疫此类攻击。即使浏览器发送了 cookie,与 cookie 关联的任何凭据都将被完全忽略。REST API 调用的身份验证以完全不同的方式完成。最常见的解决方案是拥有某种身份验证密钥(OAuth 令牌等),它在标头中的某处或可能在请求正文本身中发送。
由于身份验证是特定于应用程序的,并且由于浏览器本身不知道身份验证令牌是什么,因此即使浏览器以某种方式被欺骗访问 API 端点,也无法自动提供身份验证凭据。因此,无 cookie 的 REST 端点完全不受 CSRF 攻击。
还是我错过了什么?