9

我们的生产服务器现在已经生成了几个月的无效真实性令牌错误。几乎所有发送(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. 用户遵循典型的如果不是预期的行为。他们按照预期使用应用程序。我浏览了他们的点击并记录了行为历史来总结这一点。

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

+0

是的,我做到了。这发生在真实的用户身上。这些不是机器人。我发现的模式是典型的用户行为。他们在做什么没有任何异常。我愿意说这是预期的行为。这就是为什么它很可怕。 – jason328

+0

你能排除任何过期吗?饼干只是一件事,它可能是一些与时间相关的比较,服务器的错误时间,预计特定时间的数据库字段或类似的东西。 – Smar

+0

我不这么认为?你能澄清一下你的问题吗? – jason328

回答

1

不知道,如果这太迟了没用,但我有同样的问题。我能够重现:

  1. 请确保您退出了应用
  2. 在页面打开浏览器选项卡,将标志
  3. 让它坐太久到期会话/ CSRF令牌(可能需要几个小时)
  4. 打开登录页面的另一个选项卡,然后登录
  5. 返回到旧选项卡并尝试再次登录 - 将发生InvalidAuthenticityToken异常。

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

我不知道如何真正解决这个问题,除了更好地处理错误,以便用户看不到一个令人困惑的错误页面。

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

相关问题