我有Rails4应用程序在生产中运行,我的访问者偶尔运行到ActionController :: InvalidAuthenticityToken错误,我无法复制.我从各种形式得到2-4个日常通知,没有明确的逻辑背后.我收到的报告显示,表单提交的真实性不同于会话中保存的报告.这怎么可能?我自己很少遇到这个问题,但是不可能复制,所有的突然的真实性都与存储在会话中的一样不一致,而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="}
解决方法
由Rails生成的任何表单(即form_for等等,不用你在模板中放置< form>)就会在需要时将反CSRF令牌添加为隐藏字段.如果您自己编写了表单,并且没有包含CSRF隐藏的输入,则Rails依赖于CSRF元标记和JavaScript以使事情工作.所以如果你写了你自己的表单,并且你没有包含隐藏的字段,如果客户端的JavaScript因为某种原因不起作用,你可以得到这个错误.因为“客户端的JavaScript不适用于任何原因”子句是难以检测和调试的,所以我实际上故意删除了我的网站上的CSRF元标记.这样,如果我忘记包含隐藏的输入,它会破坏每个人(快速失败),我会立即找到它,我可以解决它.我会建议你这样做.
据说,我建议您查看这些“访客”的访问日志.你有什么奇怪的吗?
>在提交之前,他们是否立即访问具有表单的页面?如果没有,也许他们是机器人或实际的,实际的CSRF尝试(这是检查,不是吗?:)).>他们是否在一个EC2上加载表单,最后提交给另一个?如果是这样,你可以关闭一个EC2,看看错误是否消失?他们有没有失去他们的会议?这可能是你的问题或他们的.