调试随机无效的真实性令牌错误



几个月来我们的生产服务器一直在产生无效的真实性令牌错误。几乎所有发送(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. 我们使用turbollinks 2.5.3(我们没有更新这个超过一年)。
  2. 在每次无效令牌错误的情况下,用户传递一个真实性令牌给服务器,它只是以无效告终。
  3. 我们目前在应用控制器中使用protect_from_forgery with: :exception
  4. 几个月前,当我们将一堆新代码投入生产时,错误开始出现。这个新代码跨越了数百个文件,但到目前为止,我还没有发现任何与此问题相关的代码。这个错误可以在任何类型的浏览器和设备上发生。
  5. 流量增加与出现无效验证令牌之间没有相关性。
  6. 用户可以来自任何国家
  7. 这些不是机器人遇到这些问题。我们甚至有一个同事经历过这个错误,尽管他们不记得他们做了什么来产生这个错误。
  8. 用户遵循典型的(如果不是预期的)行为。他们按预期使用了这款应用。我查看了他们的点击和记录的行为历史,得出了这个结论。

最终我想找出解决这个问题的方法。我的第一步是成功地重现错误,但我甚至无法做到这一点。我的问题是:我能做些什么来弄清楚导致这种情况的原因?我别无选择了。谢谢!

不知道这是否太晚了,但我有同样的问题。我可以复制:

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

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

我不确定如何真正解决这个问题,除了更优雅地处理错误,这样用户就不会看到一个令人困惑的错误页面。

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

最新更新