将 csrf 令牌保存在 cookie 中是一种好习惯,还是在表单中使用隐藏字段更好?像验证码所做的那样,在每个用户请求中重新生成 csrf 令牌也很好吗?
谢谢
将 csrf 令牌保存在 cookie 中是一种好习惯,还是在表单中使用隐藏字段更好?像验证码所做的那样,在每个用户请求中重新生成 csrf 令牌也很好吗?
谢谢
最好将其包含在表格中。CSRF 令牌背后的想法是它不是被动传递的(例如,如果恶意用户能够诱骗浏览器访问一些做坏事的 URL)。Cookie 是被动传递的。
可以在 OWASP 网站上的OWASP CSRF 预防备忘单页面上找到对这个问题的最佳解释。
首先,将 cookie用于 CSRF 令牌并没有多大帮助,因为所有 cookie,甚至是秘密 cookie,都将随每个请求一起提交。无论最终用户是否被诱骗提交请求,都将提交所有身份验证令牌。
其次,应用程序可以将隐藏的输入参数包含在具有通用名称的表单中,例如“CSRFToken”。这个令牌的值必须是随机生成的,这样攻击者就无法猜到。
此外,Challenge-Response 是 CSRF 的另一个防御选项。它可以通过以下方式实现:
CSRF cookie 肯定容易受到攻击,但实现安全,因为会话值将始终与存储在请求的正文或标头中的提交的令牌值进行检查,因此我看不到反对的理由。OWASP 网站上概述的双重提交(仅 http cookie 与发布数据)或令牌同步器(会话与发布数据)模式都是很好的做法,并且都使用 cookie。
如前所述,双重提交将存储移动到客户端,因此被认为是无状态的,但无论哪种方式,都有两个令牌进行比较,其中一个始终对攻击者未知。