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