【问题标题】:Why are Rails Authenticity Tokens session persistent and not unique to each submission?为什么 Rails Authenticity Tokens 会话是持久的,而不是每次提交都是唯一的?
【发布时间】:2013-09-10 19:54:32
【问题描述】:

我想知道为什么 Rails 形成 Authenticity Tokens 会持续整个会话,而不是每次提交时都生成唯一的。

我来自web2py,表单是使用称为_formkey 的唯一一次性令牌生成的。 formkey自动防止由于双击、后退键缓存等导致的重复提交。

在 Rails 中,您显然必须自己处理双重提交问题(参见 https://stackoverflow.com/a/4683161/165673)。在我看来,一次性真实性令牌可以解决这个问题,并且更安全?

【问题讨论】:

  • 特别是,我认为一次性令牌方法对BREACH attack 更安全。

标签: ruby-on-rails forms web2py authenticity-token


【解决方案1】:

整个会话的一个令牌更容易实现。考虑一下您有两个打开的带有表单的选项卡的情况。

一个会话令牌与一次性令牌解决方案一样安全。至少作为对 CSRF 攻击的保护。

在 Rails 中,您显然必须自己处理重复提交问题

为此提供了开箱即用的解决方案。阅读disable_with 选项。当然,所有修改数据的请求都应该通过 HTTP POST 发送,而不是 GET。

【讨论】:

  • @Igowan - 不知道如果更容易实现的参数飞行。 web2py 做到了,并且可以轻松地处理每页/跨选项卡的多个表单(我认为独特的令牌实际上使这更容易)。关于disable_with,这是一个客户端解决方案——对用户体验很方便,但不是像标记化解决方案那样防止重复提交的可靠方法。
  • @Yarin 我使用disable_with 很多年了,效果很好。我不明白你的问题到底是什么。
  • @Igowin- disable_with 不会帮助您处理以编程方式触发的 ajax 表单提交,或者在按下后退按钮后重新点击的缓存表单。如果您的数据的完整性受到威胁,您就不能依赖基于视图的强制执行。
  • @Yarin In Rails 数据完整性由模型层保护。您也可以使用 db 约束和检查来执行此操作。 disable_with 应该用于防止双重提交问题 - 当有人不小心双击提交按钮时。
  • @Igowin - “Rails 中的数据完整性由模型层保护” - 你说得对,好点。我可能被一个想象中的问题挂断了..
猜你喜欢
  • 2016-10-27
  • 2010-10-03
  • 2013-10-29
  • 2017-04-19
  • 2015-08-07
  • 1970-01-01
  • 2019-01-06
  • 2011-04-16
  • 2019-01-29
相关资源
最近更新 更多