【发布时间】: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>
这是我目前发现的。
- 我们使用 Turbolinks 2.5.3(我们已经一年多没有更新了)。
- 在每次出现无效令牌错误的情况下,用户都会将真实性令牌传递给服务器,但它最终是无效的。
- 我们目前在应用控制器中使用
protect_from_forgery with: :exception。 - 几个月前,当我们将一堆新代码推送到生产环境时,错误开始出现。这段新代码跨越数百个文件,但到目前为止,我在代码中没有发现任何与此问题相关的内容。
- 该错误可能发生在任何类型的浏览器和设备上。
- 流量增加与出现的无效身份验证令牌之间没有关联。
- 用户可以来自任何国家/地区。
- 这些不是遇到这些问题的机器人。我们甚至有一位同事经历过这个错误,尽管他们不记得他们做了什么来产生它。
- 用户遵循典型的(如果不是预期的)行为。他们正在按预期使用该应用程序。我查看了他们的点击和记录的行为历史来得出结论。
最终我想弄清楚如何解决这个问题。我的第一步是成功重现错误,但我什至做不到。我的问题是:我能做些什么来让我弄清楚是什么原因造成的?我的选择已经不多了。谢谢!
【问题讨论】:
-
是的,我做到了。这发生在真实用户身上。这些不是机器人。我发现的模式是典型的用户行为。他们的所作所为并没有什么异常。我愿意说这是预期的行为。这就是它如此可怕的原因。
-
你能排除任何东西过期吗? Cookie 只是一回事,它可能是一些与时间相关的比较、服务器中的错误时间、期望特定时间的数据库字段或类似的东西。
-
我不这么认为?你能澄清一下你的问题吗?
-
我只是想提供一些您可以检查的想法,有时即使是模糊的远程事物也会以奇怪的方式产生影响。磁盘空间快用完了?在进行有效性检查时,通常会导致服务器上的错误时间,因为这些通常具有时间绑定。根据您的会话数据的存储,实际要检查的内容可能会有所不同,您是否尝试将会话存储交换到另一个以查看它是否可以缓解问题?
-
缓存authentity_token 时出现此错误。尝试检查项目中的所有
cache方法。可能有同样的问题。
标签: ruby-on-rails forms ruby-on-rails-4 session-cookies authenticity-token