Rails4 ActionController::InvalidAuthenticityToken 错误

2024-01-22

我有 Rails4 应用程序在生产中运行,我的访问者偶尔会遇到 ActionController::InvalidAuthenticityToken 错误,我无法重现该错误。我每天都会收到 2-4 条来自各种形式的通知,但背后没有明确的逻辑。我收到的报告显示,表单提交的authenticity_token 与会话中保存的不同。这怎么可能?我自己也遇到过几次这个问题,但是不可能重现,突然,表单的authenticity_token与会话中存储的不同,并且出现了InvalidAuthenticityToken。
有什么想法从哪里开始寻找吗?

例子:

 Request:
-------------------------------

  * URL        : https://domain/signin
  * HTTP Method: POST
  * IP address : 113.96.xx.xx
  * Parameters : {"utf8"=>"✓", "authenticity_token"=>"MOh9JDE1AZ0CbIw/M33vfhjRShwzI6oqMhi8lk+n7OE=", "email"=>"xxxx@xxx", "password"=>"[FILTERED]", "commit"=>"Sign In", "controller"=>"clients", "action"=>"signin", "locale"=>"en"}

-------------------------------
Session:
-------------------------------

  * session id: [FILTERED]
  * data: {"_csrf_token"=>"QazCSVGeZlxEh83XTM+f5PkC/zopwCF96yV4duRats0="}

更新:想补充一点,我通过两个负载平衡的 AWS EC2 实例提供页面,并将会话存储在 Redis ElastiCache 实例中


Rails 生成的任何表单(即form_for等等,而不是你把<form>在模板中)将在必要时将反 CSRF 令牌添加为隐藏字段。如果您自己编写表单并且没有包含 CSRF 隐藏输入,则 Rails 依赖 CSRF 元标记和 JavaScript 来工作。因此,如果您编写自己的表单并且没有包含隐藏字段,并且客户端的 JavaScript 由于某种原因无法工作,您可能会收到此错误。因为“客户端的 JavaScript 无论出于何种原因都无法工作”这一条款很难检测和调试,所以我实际上故意删除了我网站上的 CSRF 元标记。这样,如果我忘记包含隐藏输入,每个人都会崩溃(快速失败),我会立即发现它,并且可以修复它。我建议您也这样做。

话虽如此,我建议您查看这些“访问者”的访问日志。你看到什么奇怪的了吗?

  • 他们是否在提交表单之前立即访问包含表单的页面?如果不是,也许它们是机器人或实际的、真实的 CSRF 尝试(这就是它要检查的内容,不是吗?:))。
  • 他们是否在一台 EC2 上加载表单并最终提交给另一台 EC2?如果是这样,您可以关闭一台 EC2 并查看错误是否消失吗?
  • 他们是否以某种方式失去了会话?这可能是你的问题,也可能是他们的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails4 ActionController::InvalidAuthenticityToken 错误 的相关文章

随机推荐