我将生成一个 CSRF 令牌并将其包含在隐藏的表单字段中。收到请求时,我将根据存储在用户会话或 cookie 中的值检查表单值。
从安全角度来看,将这个令牌存储在 cookie 中而不是 session 中是否仍然被认为是可以接受的?
我将生成一个 CSRF 令牌并将其包含在隐藏的表单字段中。收到请求时,我将根据存储在用户会话或 cookie 中的值检查表单值。
从安全角度来看,将这个令牌存储在 cookie 中而不是 session 中是否仍然被认为是可以接受的?
将令牌存储在 cookie 中并不是 CSRF 问题的解决方案。CSRF 漏洞源于这样一个事实,即浏览器会随请求自动发送 cookie。因此,应用程序认为该请求来自有效(和经过身份验证的)用户。攻击者唯一需要的是应该发送的确切请求。引入随机 Anti-CSRF 令牌(特定于请求或特定于会话)导致无法(或非常困难)准备有效请求(通常情况下,攻击者不知道 anti-csrf 令牌的有效值),这样的请求将是被服务器丢弃。
如果您将令牌放入 cookie 中,它将自动发送到服务器,就像会话 cookie 一样,因此您不会从中获得任何额外的保护。
编辑:我可能误解了你的问题。您可能正在谈论所谓的双重提交 cookie 模式,其中在隐藏字段和 cookie 中发送相同的值。
是的,当在会话中存储 CSRF 令牌有问题时,这种方法是可以接受的,您可以在此处阅读更多相关信息:Double Submit Cookies。
虽然我想不出对这样一个系统的任何直接攻击,但我认为将这样的令牌放在客户端并不是一个好主意。您正在向潜在的泄漏敞开大门。将它们存储在会话中会使它们无法检索。
将其存储为 cookie 只会使实施重放攻击变得微不足道。
如果它存储在会话中,那么虽然有一个小窗口重放相同的令牌会影响 CSRF,但机会窗口会大大减少 - 特别是如果您添加一些会话验证(跟踪用户代理更改 - 但要注意 Chrome将在会话中透明地升级自身 - 或使用来自客户端 IP 地址的组织名称)