5

这是代码:

class M
  include Mongoid::Document
  field :name
end

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

请注意,age它没有被定义,但它被保存了。

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

到目前为止,除了 之外,我什么也找不到attr_accessible,但这对 Mongoid 来说并不是很好,因为您必须在所有模型中field始终保持相同的字段名称。attr_accessible不干燥。

我认为attr_accessibleAPI 非常适合 ActiveRecord,因为有一个。您没有在模型(DRY)和b 中明确定义字段。保证不会将不存在的字段保存到 RDB。但是对于 Mongoid,我认为应该有比attr_accessible.

请注意,有一个全局配置设置allow_dynamic_fields,但它与批量分配无关,因此超出了本次讨论的范围,但我认为它实际上应该是每个模型的宏,并且还应该处理批量分配。

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

4

2 回答 2

1

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

attr_accessible *fields.keys
于 2011-11-30T00:46:17.097 回答
0

我为解决此问题所做的工作是在我的模型中使用 before save 回调:

set_callback(:save, :before) do |doc|
    (doc.attributes.keys - fields.keys).each { |f| doc.unset(f) }
end

这样,即使有额外的属性,它们也会在保存之前被删除。

于 2014-01-24T22:04:23.557 回答