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

Где ORM не спасает от инъекций

Вопрос

В каком случае Django ORM не защитит от SQL-инъекции?

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

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

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

Коротко

Правильный ответ: User.objects.raw(f"SELECT FROM authuser WHERE username = '{name}'"). ORM параметризует значения в filter, exclude, get и лукапах.

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

  1. User.objects.raw(f"SELECT * FROM auth_user WHERE username = '{name}'")правильный ответ
  2. User.objects.filter(username=name)
  3. User.objects.filter(username__icontains=name)
  4. User.objects.raw("SELECT * FROM auth_user WHERE username = %s", [name])

Разбор

ORM параметризует значения в filter, exclude, get и лукапах. Но если собрать SQL f-строкой и передать в raw(), extra() или RawSQL, ORM уже ничего не экранирует. Тот же raw() с плейсхолдером и списком параметров безопасен. В SQLAlchemy аналогично: text() с :param безопасен, text(f"...") нет.

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

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

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