我们是否必须为网站中的每个表单生成一个令牌?我的意思是,每次为每个请求的表单生成不同的令牌?如果没有,为什么?
答案 0 :(得分:33)
一般情况下,只需要one token per session即所谓的每会话令牌就足够了:
通常,开发人员只需为当前会话生成一次此令牌。在初始生成此令牌后,该值将存储在会话中,并用于每个后续请求,直到会话到期为止。
如果您想进一步增强安全性,可以为每个表单/ URL(每个表单标记)使用一个标记,以减轻一个标记泄漏时的影响(例如{{{ 3}})因为攻击者只能成功攻击该特定表单/ URL。
但是使用 per-request tokens ,i。即随每个请求而变化的令牌,而不是削弱网站的可用性,因为它限制了并行浏览:
为了进一步增强此提议设计的安全性,请考虑为每个请求随机化CSRF令牌[...]。实现此方法导致生成每请求令牌而不是每会话令牌。但请注意,这可能会导致可用性问题。例如,“后退”按钮浏览器功能经常受到阻碍,因为前一页可能包含不再有效的令牌。与此上一页的交互将导致服务器上出现CSRF误报安全事件。
因此,我建议您使用每会话令牌或每个表单令牌。
答案 1 :(得分:11)
不,你只需要generate a token on a per-session basis。
如果用户一次在两个不同的选项卡/窗口中浏览网站,那么用户不会意外泄露令牌并且每个表单生成令牌会使事情变得非常复杂。