我已添加此修复程序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
每个模型中的所有属性?
答案 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语句明确说明哪些字段应该可以通过批量分配来访问。