【问题标题】:Mongoid: How to prevent undefined fields from being created by mass assignment?Mongoid:如何防止批量赋值创建未定义的字段?
【发布时间】:2023-04-01 15:46:01
【问题描述】:

代码如下:

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,但它与批量分配无关,因此超出了本次讨论的范围,但我认为它实际上应该是每个模型的宏,并且还应该处理批量分配.

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

【问题讨论】:

  • 您找到解决方案了吗?我也面临同样的问题。

标签: ruby-on-rails mongoid mass-assignment


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2022-10-24
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多