Выбор ответа Senior Безопасность веб-приложения обновлено

Mass assignment

Вопрос

Эндпоинт обновления профиля делает User.objects.filter(pk=me.id).update(**request.data). Чем это опасно?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Клиент передаст любые поля модели, например isstaff=true, и изменит их. Фильтр ограничивает, какую строку меняем, но не какие колонки.

Варианты ответа

  1. Это вызовет SQL-инъекцию через имена полей, подставленные в запрос
  2. Клиент передаст любые поля модели, например is_staff=true, и изменит ихправильный ответ
  3. Это медленнее save(), потому что update не использует кеш объектов
  4. Ничем: filter(pk=me.id) уже ограничивает, что пользователь может менять

Разбор

Фильтр ограничивает, какую строку меняем, но не какие колонки. Передача всех полей из запроса в модель это уязвимость массового присваивания. Защита: явный список разрешённых полей (сериализатор с fields и read_only_fields, Pydantic-модель запроса). Имена полей проходят через ORM как именованные аргументы и в SQL не подставляются строкой, поэтому инъекции здесь нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме