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&bogus=#'x'*1000000
)
到目前为止,除了attr_accessible
,我什么都找不到,但这对于 Mongoid 来说并不是很好,因为您必须在所有模型中始终在 field
和 attr_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:如何防止批量赋值创建未定义的字段?的主要内容,如果未能解决你的问题,请参考以下文章