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