【问题标题】:CSRF protection: do we have to generate a token for every form?CSRF 保护:我们是否必须为每个表单生成一个令牌?
【发布时间】:2012-01-29 03:51:15
【问题描述】:

我们是否必须为网站中的每个表单生成一个令牌?我的意思是,每次都为每个请求的表单生成不同的令牌?如果不是,为什么?

【问题讨论】:

标签: security csrf


【解决方案1】:

不用,你只需要generate a token on a per-session basis

令牌不太可能被用户意外泄露,如果用户同时在两个不同的选项卡/窗口中浏览网站,则为每个表单生成令牌会使事情变得非常复杂。

【讨论】:

  • 谢谢。那么,令牌仍然会以每种形式放置(但只是每个会话令牌没有不同)?
【解决方案2】:

一般来说,只需one token per session,即所谓的每会话令牌就足够了:

一般来说,开发者只需要为当前会话生成一次这个令牌。初始生成此令牌后,该值将存储在会话中,并用于每个后续请求,直到会话过期。

如果您想进一步提高安全性,您可以为每个表单/URL 使用一个令牌(per-form token)以减轻一个令牌泄漏时的影响(例如@987654322 @) 因为攻击者只能成功攻击该特定表单/URL。

但使用 每个请求的令牌,i。 e.令牌随每个请求而变化,而是降低了网站的可用性,因为它限制了并行浏览:

为了进一步增强此提议设计的安全性,请考虑为每个请求随机化 CSRF 令牌 [...]。实施这种方法会生成按请求令牌而不是按会话令牌。但是请注意,这可能会导致可用性问题。例如,“返回”按钮浏览器功能经常受到阻碍,因为前一页可能包含不再有效的令牌。与上一页的交互将导致服务器发生 CSRF 误报安全事件。

所以我建议您使用每会话令牌或每表单令牌。

【讨论】:

  • 我认为每个表单令牌在以下情况下会起作用:a) 您仅在用户首次加载表单时创建令牌,任何后续表单加载都应重新使用第一个令牌对于那个表格。 b) 在会话中存储令牌时,它应该包含特定页面/表单的标识符。例如。 SESSION['edit-user-csrf'] 和 SESSION['edit-order-csrf'] 这样您就可以在不同的选项卡中打开不同的页面,并且这两个表单仍然可以成功提交,因为会话存储了两者令牌(每种形式一个)。该页面知道要检查和使用哪个 csrf 令牌,因为它在该页面上。
  • 确保您有需要重新身份验证和新令牌生成的不活动和绝对会话时间。 (例如:20 分钟不活动或 4 小时绝对)
  • @zuallauz 表单的 URL 可用于识别表单。如果这还不够,您可以向其中添加任何其他识别信息(例如隐藏的输入值),或者更好的是,使用form container to store the hidden input values into 也将prevent spoofing of hidden input values
  • @LaJmOn 这没有必要。您应该选择一种生成具有足够熵的令牌的算法,这将使猜测有效令牌并非不切实际。重新生成令牌只会惹恼用户。
  • 如果使用适当的 XSS,通常会泄漏站点中的任何令牌 - 您可以在 XSS 中进行 AJAX/iframe GET 调用以形成页面并使用您的预期值发布表单。
猜你喜欢
  • 2013-04-25
  • 2012-09-18
  • 2020-06-08
  • 2016-04-25
  • 2012-11-04
  • 2014-10-19
  • 1970-01-01
  • 2020-02-19
相关资源
最近更新 更多