针对 CSRF 的 SameSite 标志

SameSite Flag against CSRF

我想知道会话 cookie 上的 SameSite 标志是否足以防止 CSRF 攻击。
我到处都看到 CSRF 令牌解决方案,但我不确定如果用于身份验证的 cookie 已经受到 SameSite 标志的保护(在严格模式下)是否需要使用 CSRF 令牌。
最重要的是,如果我理解得很好,cookie 仍然会与 api.myapp.com 这样的子域 URL 一起发送,这将非常适合我的需要。

这有点自以为是,或者至少取决于您的目标受众和风险偏好。

SameSite=strict 几乎 所有相当新的浏览器都支持 here,但请注意 IE11 除外。不再有多少人使用 IE11,但对他们来说还不够好。只有您可以回答这是否适合您的用例,在撰写本文时,大量用户将不会受到保护。

此外,普遍的共识似乎是 SameSite 应该只用作纵深防御(例如 here or here 在类似的问题中),但大多数关注点都在 Lax 周围,并且更少 Strict。然而,Strict 对用户非常不友好,在实际应用程序中你可能无法真正使用 Strict,因为那是非常糟糕的 UX。

通常的争论是围绕浏览器支持(如上所述)、GET 请求更改状态(仅与 Lax 相关),以及一些特殊情况仍然围绕 GET 更改状态。

所以我目前的看法是 SameSite=Strict 总体上不够好是因为缺乏完整的浏览器支持 (IE11),反对它的一个重要方面是糟糕的用户体验。我可以想象它足够好的情况。 SameSite=Lax 我认为只是一种纵深防御措施,因为上面的问题,现在可能不会影响你的应用程序,但将来可能会,没有人会记得考虑 SameSite 设置.

Gabor 的出色回答很好地解释了问题。不过有一种方法可以解决此问题,如果您将代码设置为 SPA,则可以像这样工作:

  • Web 内容请求(如导航)不需要 cookie
  • SameSite=strict cookie 仅用于 Ajax 获取数据的请求

工作原理

OAUTH

对于前端解决方案的 OAuth 后端,您可以这样做:

  • https://api.mywebapp.com
  • 主持 API
  • 当网络应用程序收到 OAuth 响应时,它会将授权码发送到 API
  • API 对其进行处理,然后发出包含令牌的高度加密的 cookie