flawopen.com/Mass assignment/Объяснение
Mass assignment: риски и безопасные списки полей
Представьте модель как форму с полями пользователя и элементами управления для сотрудников. Привязка всего запроса позволяет задать также владельца, одобрение или роль. Определяйте поля на сервере и авторизуйте запись и операцию отдельно.
# Rails: request keys reach model attributes User.new(params[:user]) // Node / Mongoose: request object used as update await User.findByIdAndUpdate(id, req.body); // Express + Sequelize: request object used as create values await User.create(req.body); # Django: request keys passed as model fields User.objects.create(**request.POST.dict())
# Rails — permit only user-editable fields attrs = params.require(:user).permit(:name, :email) user = User.new(attrs) // Node — construct an allowlisted update const { name, email } = req.body; await User.findByIdAndUpdate(id, { name, email }); # Django — explicit ModelForm fields class UserForm(ModelForm): class Meta: model = User fields = ["name", "email"] // .NET — bind a DTO, then map explicitly user.Name = input.Name; user.Email = input.Email;
Зачем нужны серверные списки разрешённых полей
Список «всё, кроме role» может пропустить новое чувствительное поле. В списке разрешений новые поля закрыты, пока код явно их не откроет. Rails Strong Parameters отклоняет неразрешённые атрибуты при массовом присваивании, но контроллер должен разрешать поля только для данного действия. DTO или явный список полей создают такую же границу.
Список ограничивает атрибуты запроса, но не даёт права менять запись. Ограничьте её аутентифицированным субъектом, авторизуйте операцию и отделите привилегированные изменения.
Категории чувствительных полей
Проверьте атрибуты моделей, вложенные сериализаторы и обработчики обновления:
- ✓Ключи владельца и арендатора — user_id, account_id, tenant_id. Проверяйте принадлежность на сервере; не доверяйте владельцу от клиента.
- ✓Роли, разрешения и состояние процесса — role, is_admin, email_verified, status. Меняйте только через авторизованный серверный процесс.
- ✓Финансовые значения и вложенные/системные поля — балансы, скидки, кредиты, связи, временные метки и ID влияют на правила или область обновления. Разрешайте и проверяйте каждое поле.
Частые вопросы
Это разные слабые места. Mass assignment задаёт лишние атрибуты создаваемого или изменяемого объекта. Prototype pollution меняет свойства прототипа и может влиять на поиск свойств других объектов. Небезопасное слияние может привести к этому; mass assignment зависит от использования свойств. См. prototype pollution.
Нет. Мутация может принимать слишком широкий объект. Ограничьте входные типы полями, которые клиент вправе менять, и проверяйте доступ в резолвере или сервисе.
Нет. Форма не ограничивает HTTP-клиента. Считайте поля контролируемыми атакующим, проверяйте их на сервере и принимайте только поля действия.