【问题标题】:Debugging Random Invalid Authenticity Token Errors调试随机无效的真实性令牌错误
【发布时间】:2017-03-16 05:58:37
【问题描述】:

我们的生产服务器几个月来一直在产生无效的真实性令牌错误。几乎所有发送 (PUT|POST|DELETE) 请求的表单都会产生错误。有时会发生错误,有时不会。它们发生的原因似乎没有押韵或原因。错误本身并不经常发生,但对我们来说是一个担忧。下面是导致此错误的典型表单的示例。

<form class="button_to" method="post" action="/lesson_progress_trackers/333">  
  <input type="hidden" name="_method" value="patch">
  <input class="finish-lesson-button" type="submit" value="Done!">
  <input type="hidden" name="authenticity_token" value="Qd3FsJZY2UXR9vahuFmaY5rrqA+J5xzGpl4cGI2Vwerx8PZPQtDMugz6oqoe3iviC+/U5zTYPdeX3apwbap09E==">
  <input type="hidden" name="completed" value="true">
</form>

这是我目前发现的。

  1. 我们使用 Turbolinks 2.5.3(我们已经一年多没有更新了)。
  2. 在每次出现无效令牌错误的情况下,用户都会将真实性令牌传递给服务器,但它最终是无效的。
  3. 我们目前在应用控制器中使用protect_from_forgery with: :exception
  4. 几个月前,当我们将一堆新代码推送到生产环境时,错误开始出现。这段新代码跨越数百个文件,但到目前为止,我在代码中没有发现任何与此问题相关的内容。
  5. 该错误可能发生在任何类型的浏览器和设备上。
  6. 流量增加与出现的无效身份验证令牌之间没有关联。
  7. 用户可以来自任何国家/地区。
  8. 这些不是遇到这些问题的机器人。我们甚至有一位同事经历过这个错误,尽管他们不记得他们做了什么来产生它。
  9. 用户遵循典型的(如果不是预期的)行为。他们正在按预期使用该应用程序。我查看了他们的点击和记录的行为历史来得出结论。

最终我想弄清楚如何解决这个问题。我的第一步是成功重现错误,但我什至做不到。我的问题是:我能做些什么来让我弄清楚是什么原因造成的?我的选择已经不多了。谢谢!

【问题讨论】:

  • 是的,我做到了。这发生在真实用户身上。这些不是机器人。我发现的模式是典型的用户行为。他们的所作所为并没有什么异常。我愿意说这是预期的行为。这就是它如此可怕的原因。
  • 你能排除任何东西过期吗? Cookie 只是一回事,它可能是一些与时间相关的比较、服务器中的错误时间、期望特定时间的数据库字段或类似的东西。
  • 我不这么认为?你能澄清一下你的问题吗?
  • 我只是想提供一些您可以检查的想法,有时即使是模糊的远程事物也会以奇怪的方式产生影响。磁盘空间快用完了?在进行有效性检查时,通常会导致服务器上的错误时间,因为这些通常具有时间绑定。根据您的会话数据的存储,实际要检查的内容可能会有所不同,您是否尝试将会话存储交换到另一个以查看它是否可以缓解问题?
  • 缓存authentity_token 时出现此错误。尝试检查项目中的所有 cache 方法。可能有同样的问题。

标签: ruby-on-rails forms ruby-on-rails-4 session-cookies authenticity-token


【解决方案1】:

不知道这是否为时已晚而无用,但我遇到了同样的问题。我能够通过以下方式重现:

  1. 确保您已退出应用程序
  2. 打开浏览器选项卡进入登录页面
  3. 让它等待足够长的时间以使会话/csrf 令牌过期(可能是几个小时)
  4. 在登录页面打开另一个选项卡,然后登录
  5. 返回旧选项卡并尝试再次登录 - 出现 InvalidAuthenticityToken 异常。

我认为这发生在我身上是因为两个标签共享一个会话,即在打开新标签时创建的会话。但是,旧选项卡在登录表单中仍然具有来自旧会话的 csrf 令牌。当新的会话 cookie 和旧的 csrf 令牌一起提交时,它们不匹配,因此抛出错误。

除了更优雅地处理错误以使用户不会看到令人困惑的错误页面之外,我不确定如何实际解决此问题。

顺便说一句,我正在使用 devise,但我认为它不是 Devise 特有的。

【讨论】:

  • 这非常有帮助,谢谢。我认为这解释了我所看到的问题。
猜你喜欢
  • 2014-07-15
  • 1970-01-01
  • 2019-06-20
  • 2018-06-29
  • 2016-03-19
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多