如何在mongoid应用程序中保护所有字段免受大规模分配

时间:2012-06-26 10:24:40

标签: ruby-on-rails ruby-on-rails-3 mongoid mass-assignment

我已添加此修复程序https://gist.github.com/2382288,以保护所有字段免受mongoid应用程序中的批量分配。

在我的config/initializers/mongoid.rb中我添加了此修复程序:

module Mongoid
  module MassAssignmentSecurity
    extend ActiveSupport::Concern

    included do
      attr_accessible nil
    end
  end

  module Document
    include MassAssignmentSecurity
  end
end

我的问题是:

此修复程序可以完全保护您的应用程序免受攻击质量分配?

或建议添加 attr_accessible 每个模型中的所有属性?

4 个答案:

答案 0 :(得分:1)

创建自动加载文件及以下内容:

module Mongoid
  module MassAssignmentSecurity
    extend ActiveSupport::Concern

    included do
      attr_accessible(nil)
      self.mass_assignment_sanitizer = :strict
    end
  end

  module Document
    include MassAssignmentSecurity
  end
end

执行上述操作会导致适当的加注,就像使用ActiveRecord一样:

jordon@envygeeks:~/development/gryffindor$ rails c
Loading development environment (Rails 3.2.6)

[1] pry(main)> Page.new => #<Page _id: RANDOM_ID, _type: "Page", content: nil>
[2] pry(main)> Page.new(t: 't') => ActiveModel::MassAssignmentSecurity::Error

如果没有对代码进行上述修复,您将只收到失去加注的方法,因为它是一个普遍的例外,甚至没有将您的应用程序指向正确的方向。

答案 1 :(得分:1)

我建议尝试使用strong_parameters gem https://github.com/rails/strong_parameters http://railscasts.com/episodes/371-strong-parameters (需要订阅观看此剧集)

strong_parameters将包含在rails 4中(并且是默认值)。它已经在rails中合并。 我在我的一个项目中使用这个gem,与attr_accessible相比,它提供了很大的灵活性。

答案 2 :(得分:0)

这将使默认情况下所有Mongoid :: Documents不接受任何字段进行批量分配。这可能不是您想要的,因为您将无法@model.update(params[:model)

您几乎肯定想要进入该文档并添加:

attr_accessible :first_name, :last_name

答案 3 :(得分:0)

  

此修复程序是否完全保护您的应用程序免受攻击质量分配?

是的,这将阻止大量分配到任何字段,并且在安全应用程序中是正确的默认值。

  

或者建议在每个模型中添加attr_accessible所有属性吗?

不是“或”,而是“和”。您应该使用建议的代码默认值,强制所有文档使用白名单。然后在每个文档中,您通过attr_acessible语句明确说明哪些字段应该可以通过批量分配来访问。