【发布时间】:2018-11-13 00:48:56
【问题描述】:
我正在将一个大型网站包从 Ruby 1.9 迁移到 Ruby 2.3,我几乎完成了。我已经让 Rails 几乎完全从 3.2 迁移到 4.2,但是我遇到了一个我无法弄清楚的问题,这个项目是我第一次使用 Ruby 或 Rails,所以我一直在使用术语作为我去。
当我将浏览器指向我的开发服务器时,我所有的 GET 请求都成功 (200),但我所有的 POST 请求都失败了 (500)。经过一番研究,我发现了 Rails 内置的 CSRF 保护,并且能够确定我正在使用的包在使用 Rails 3.2 时具有这种保护。
有了 Rails 4.2,保护似乎阻止了任何 POST 请求成功。在进一步研究之后,我发现 Rails 4 在将 auth cookie 发送到 Web 服务器之前对其进行加密,而 Rails 3 没有,并且在所有用户都使用 Rails 4 之前使用 Rails 3 cookie 是一个好习惯。我注释掉了我在迁移过程中创建的 secret_key_base 定义,并清除了浏览器缓存,所以据我了解,我现在应该使用未加密的 Rails 3 cookie。
但是,我的 POST 请求仍然抛出 500s。我不能分享太多代码,但我引用了this official guide,我的应用程序控制器中确实有这一行:
protect_from_forgery with: :exception
我也验证了如果我注释掉保护和使用:
skip_before_action :verify_authenticity_token
那么 POST 请求就会成功(它们只是非常不安全)。
我读过的大部分内容似乎表明此功能取决于我在上面显示的protect_from_forgery 行,仅此而已。
我似乎无法让这些请求成功,我想知道这是否只是我尚未掌握的另一层知识。非常感谢任何帮助。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4