Выбор ответа Senior Безопасность веб-приложения обновлено
Mass assignment
Вопрос
Эндпоинт обновления профиля делает User.objects.filter(pk=me.id).update(**request.data). Чем это опасно?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Клиент передаст любые поля модели, например isstaff=true, и изменит их. Фильтр ограничивает, какую строку меняем, но не какие колонки.
Варианты ответа
- Это вызовет SQL-инъекцию через имена полей, подставленные в запрос
- Клиент передаст любые поля модели, например
is_staff=true, и изменит ихправильный ответ - Это медленнее
save(), потому чтоupdateне использует кеш объектов - Ничем:
filter(pk=me.id)уже ограничивает, что пользователь может менять
Разбор
Фильтр ограничивает, какую строку меняем, но не какие колонки. Передача всех полей из запроса в модель это уязвимость массового присваивания. Защита: явный список разрешённых полей (сериализатор с fields и read_only_fields, Pydantic-модель запроса). Имена полей проходят через ORM как именованные аргументы и в SQL не подставляются строкой, поэтому инъекции здесь нет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.