跨站点请求伪造防护:对同步器令牌模式使用 cookie

Cross-Site Request Forgery Prevention: using a cookie for the Synchronizer Token Pattern

提问人:davidm_uk 提问时间:10/12/2023 更新时间:10/13/2023 访问量:61

问:

用于 CSRF 预防的同步器令牌模式的 OWASP 描述(此处)指出:

对于同步令牌模式,不应使用 cookie 传输 CSRF 令牌。

我的理解是,这是指将 CSRF 令牌从服务器传输到客户端。(我知道 CSRF 令牌必须以隐藏的表单字段或自定义标头值从客户端发送到服务器。

使用 cookie 将 CSRF 令牌从服务器传输到客户端会带来哪些安全风险?

OWASP备忘单继续说:

CSRF 令牌可以作为响应有效负载(例如 HTML 或 JSON 响应)的一部分传输到客户端。

如果服务器在响应客户端对 CSRF 令牌的请求时仅验证会话 ID(由会话 cookie 的存在确定),这肯定会完全绕过保护,因为攻击者可以在发送 CSRF 令牌以验证后续请求之前发出跨站点请求以检索 CSRF 令牌?

饼干 csrf owasp

评论

1赞 Heiko Theißen 10/12/2023
这回答了你的问题吗?CSRF 令牌与会话 Cookie
0赞 davidm_uk 10/12/2023
谢谢,@HeikoThei ßen。我认为这回答了我的第二个问题,指出对客户端CRSF令牌请求的响应必须包含标头,从而导致获取失败。Access-Control-Allow-Origin
0赞 Heiko Theißen 10/12/2023
如果 CSRF 令牌只是另一个 cookie,攻击者可能导致受害者的浏览器 (1) 获取 CSRF cookie 和 (2) 在后续请求中使用它,因为攻击者只需要触发请求,而不需要查看他们的响应。(实际上,它更复杂,请参阅 developer.mozilla.org/en-US/docs/Web/HTTP/Headers/...)
0赞 davidm_uk 10/13/2023
我知道服务器不得使用 cookie 中存在的 CSRF 令牌来验证请求 - 但我不明白为什么服务器不能使用 Set-Cookie 响应标头将其传送到客户端,这似乎是推荐用于双重提交 Cookie 模式的。(“简而言之,攻击者在跨站点请求期间无法访问 cookie 值。这可以防止它们在隐藏的表单值中包含匹配值或作为请求参数/标头。
0赞 Heiko Theißen 10/13/2023
使用双重提交 Cookie 模式时,令牌将作为 Cookie 接收,但在表单字段中重新提交。如果令牌既被接收又作为 cookie 重新提交,则会发生我之前评论中的漏洞。

答:

1赞 davidm_uk 10/13/2023 #1

从我与Heiko的讨论中(谢谢),我得出结论:

  1. 同步器令牌模式不鼓励使用 cookie 将 CSRF 令牌从服务器发送到 cookie,因为使用 cookie 没有特别的理由,但存在潜在的缺点:

    • 将令牌放在 cookie 中将导致它与每个请求一起发送,从而增加泄露的风险。
    • 如果服务器实现不正确地检查 cookie 中是否存在 CSRF 令牌,则会完全破坏该机制。(服务器必须在请求正文或自定义标头中检查CRSF令牌。
  2. 跨域资源共享 (CORS) 可防止攻击者请求 CRSF 令牌。CORS 提供额外的保护,如果服务器设置了标头,则禁止发送凭据(例如会话 cookie)。Access-Control-Allow-Origin: *