11

我们的生产服务器几个月来一直在产生无效的真实性令牌错误。几乎所有发送 (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. 用户遵循典型的(如果不是预期的)行为。他们正在按预期使用该应用程序。我查看了他们的点击和记录的行为历史来得出结论。

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

4

1 回答 1

2

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

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

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

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

顺便说一句,我正在使用设计,但我认为它不是特定于设计的。

于 2017-02-16T22:36:27.007 回答