Mongoid:如何防止通过批量分配创建未定义的字段?

ken*_*enn 5 ruby-on-rails mass-assignment mongoid

这是代码:

class M
  include Mongoid::Document
  field :name
end

params = { name: "foo", age: 20 }
M.create(params)
#=> #<M name: "My Name", age: 20>
Run Code Online (Sandbox Code Playgroud)

请注意,age未定义但已保存.

这是有问题的(可能是DoS的来源),因为恶意用户可以在POST中添加任何参数,并且大字符串可以潜入未知字段.(例如name=foo&bogus=#{'x'*1000000})

到目前为止,我无法找到任何东西,但attr_accessible,但你必须保持在两个相同的字段名称它不是Mongoid真正伟大fieldattr_accessible所有的时间,所有车型.不干.

我认为attr_accessibleAPI非常适合ActiveRecord,因为有一个.您没有明确定义模型(DRY)和b中的字段.保证不存在将不存在的字段保存到RDB的可能性.但对于Mongoid,我认为应该有一个更好的解决方案attr_accessible.

请注意,有一个全局配置设置,allow_dynamic_fields但它不是关于质量分配,所以它超出了本讨论的范围,但是我认为它实际上应该是一个每个模型的宏,并且还应该注意质量分配.

你是如何处理这个问题的?

Zar*_*ony 1

我总是attr_accessible在模型中使用。我很少发现自己把所有领域都纳入了可及的范围。通常总是有一些字段不应该被批量分配访问。如果您经常需要包含每个属性并且担心重复:

attr_accessible *fields.keys
Run Code Online (Sandbox Code Playgroud)