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

Сортировка по параметру из запроса

Вопрос

API принимает ?sort=price и подставляет значение в ORDER BY. Как сделать это безопасно?

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

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

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

Коротко

Правильный ответ: Сверять значение с белым списком полей и только потом подставлять. Плейсхолдеры работают только для значений, а не для идентификаторов: ORDER BY %s отсортирует по константе, а не по колонке.

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

  1. Передать как параметр %s в ORDER BY, драйвер сам экранирует
  2. Экранировать кавычки и точку с запятой в значении перед подстановкой
  3. Ограничить длину параметра 20 символами, чтобы не влез подзапрос
  4. Сверять значение с белым списком полей и только потом подставлятьправильный ответ

Разбор

Плейсхолдеры работают только для значений, а не для идентификаторов: ORDER BY %s отсортирует по константе, а не по колонке. Экранирование кавычек не спасает: инъекция в идентификатор не требует кавычек. Ограничение длины тоже. Надёжно только сопоставление с белым списком: {"price": "price", "-price": "-price"}. В Django order_by(user_value) без проверки ещё и позволит сортировать по связанным полям, раскрывая данные.

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

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

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