Mongoid:如何防止批量赋值创建未定义的字段?

Posted

技术标签:

【中文标题】Mongoid:如何防止批量赋值创建未定义的字段?【英文标题】:Mongoid: How to prevent undefined fields from being created by mass assignment? 【发布时间】:2011-12-13 15:19:36 【问题描述】:

代码如下:

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&amp;bogus=#'x'*1000000

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

我认为attr_accessible API 非常适合 ActiveRecord,因为 a. 您没有明确定义模型中的字段 (DRY) 和 b.保证没有机会将不存在的字段保存到 RDB。但是对于Mongoid,我觉得应该有比attr_accessible更好的解决方案。

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

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

【问题讨论】:

您找到解决方案了吗?我也面临同样的问题。 【参考方案1】:

我为解决这个问题所做的就是在我的模型中使用保存前回调:

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

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

【讨论】:

【参考方案2】:

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

attr_accessible *fields.keys

【讨论】:

以上是关于Mongoid:如何防止批量赋值创建未定义的字段?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoid 批量插入/更新?

arcgis如何批量给一字段赋值

arcgis如何批量给一字段赋值

批量查找 mongoDB 记录(使用 mongoid ruby​​ 适配器)

如何获取 Mongoid 文档的所有字段名称?

如何在 Mongoid & Rails 中使用数组字段?