针对 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 获取数据的请求
工作原理
- 如果您的网络应用程序运行在 https://mywebapp.com
- 然后作为在 https://api.mywebapp.com
调用 API 的结果发出安全 cookie
- Cookie 的域为 .mywebapp.com 并且是 SameSite + Cross Origin
OAUTH
对于前端解决方案的 OAuth 后端,您可以这样做:
- 在 https://api.mywebapp.com
主持 API
- 当网络应用程序收到 OAuth 响应时,它会将授权码发送到 API
- API 对其进行处理,然后发出包含令牌的高度加密的 cookie
我想知道会话 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 获取数据的请求
工作原理
- 如果您的网络应用程序运行在 https://mywebapp.com
- 然后作为在 https://api.mywebapp.com 调用 API 的结果发出安全 cookie
- Cookie 的域为 .mywebapp.com 并且是 SameSite + Cross Origin
OAUTH
对于前端解决方案的 OAuth 后端,您可以这样做:
- 在 https://api.mywebapp.com 主持 API
- 当网络应用程序收到 OAuth 响应时,它会将授权码发送到 API
- API 对其进行处理,然后发出包含令牌的高度加密的 cookie