从Rails3迁移到Rails4时的CSRF保护



我正在将一个大型网站包从Ruby 1.9迁移到Ruby 2.3,我几乎完成了。我的Rails几乎完全从3.2迁移到了4.2,但我遇到了一个我无法解决的问题,这个项目是我第一次使用Ruby或Rails,所以我一直在学习术语。

当我将浏览器指向开发服务器时,我的所有GET请求都成功了(200(,但我的所有POST请求都失败了(500(。经过一些研究,我发现了Rails内置的CSRF保护,并能够确定我正在使用的包在使用Rails3.2时具有这种保护。

有了Rails4.2,保护措施似乎阻止了任何POST请求的成功。经过进一步的研究,我发现Rails 4在将auth cookie发送到web服务器之前会对其进行加密,而Rails 3则没有,并且在所有用户都使用Rails 4之前,使用Rails 3 cookie是一种很好的做法。我注释掉了作为迁移的一部分创建的secret_key_base定义,并清除了浏览器缓存,所以据我所知,我现在应该使用未加密的Rails3cookie。

但是,我的POST请求仍然抛出500。我不能分享太多代码,但我已经参考了这个官方指南,我的应用程序控制器中确实有这一行:

protect_from_forgery with: :exception

我还验证了,如果我评论出保护和使用:

skip_before_action :verify_authenticity_token

则POST请求成功(它们只是非常不安全(。

我读到的大部分内容似乎表明这个功能依赖于我上面显示的protect_from_forgery行,仅此而已

我似乎无法让这些请求成功,我想知道这是否只是我还没有掌握的另一层知识。非常感谢您的帮助。

您的应用程序布局,可能app/views/layouts/applications.html.erb需要参考<%= csrf_meta_tags %>

这就是所有表单帖子中包含和检查的内容。

如果你没有在所有视图中使用这种布局,你需要找到另一种方法来确保它在任何地方都被引用。

文档

您有config/secrets.yml文件吗?它应该看起来像这样:

development:
secret_key_base: a75d...
test:
secret_key_base: 492f...
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

如果是这样,您需要确保您的服务器已经设置了环境变量。密钥需要小心处理,决不能承诺公开回购,即GIT。

请参阅https://guides.rubyonrails.org/v4.2/security.html

最新更新