Mongoid: Как предотвратить массовое назначение неопределенных полей? - PullRequest
5 голосов
/ 23 октября 2011

Вот код:

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, но речь идет не о массовом назначении, поэтому она выходит за рамки этого обсуждения, однако я думаю, что на самом деле это должен быть макрос для каждой модели, а также должен заботиться о массовом назначении .

Как вы справляетесь с этой проблемой?

Ответы [ 2 ]

1 голос
/ 30 ноября 2011

Я всегда использую attr_accessible в моделях.Я редко обнаруживал, что все поля доступны.Обычно всегда есть несколько полей, которые не должны быть доступны для массового назначения.Если вам часто нужно включать каждый атрибут и вас беспокоит дублирование:

attr_accessible *fields.keys
0 голосов
/ 25 января 2014

Что я сделал для решения этой проблемы, так это использовал в моей модели обратный вызов перед сохранением:

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

Таким образом, даже если есть дополнительные атрибуты, которые они удаляют перед сохранением.

...