Не смешивайте SQL-код с недоверенными значениями: передавайте значения через параметры драйвера. Имена таблиц, колонок и направление сортировки выбирайте из разрешённого набора, при необходимости используя API для идентификаторов. Проверяйте raw SQL и динамический SQL в процедурах. ORM безопасен только при корректном использовании; права БД ограничивают последствия, но не заменяют параметризацию.
Как защитить приложение от SQL-инъекций без WAF, IPS и IDS?
Параметризация значений, безопасный выбор идентификаторов и минимальные права БД. Почему ORM и фильтрация кавычек сами по себе не гарантируют защиту.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Основная защита находится в приложении: структура SQL должна оставаться кодом, а ввод — данными. Не собирайте запрос из пользовательских строк конкатенацией или интерполяцией.
Пример с psycopg2, где username передаётся отдельно:
cursor.execute(
"SELECT id, username FROM users WHERE username = %s",
(username,),
)
%s здесь — placeholder драйвера, не оператор форматирования Python. Кавычки вокруг него не ставят. Для одного параметра нужна последовательность, поэтому у кортежа есть запятая. См. документацию psycopg2.
Параметризация значений не предназначена для имени таблицы или ключевого слова ASC. Такие части выбирают по разрешённому отображению, а идентификаторы оформляют средствами драйвера. Проверка типов, диапазонов и длины полезна, но список запрещённых символов не заменяет эту границу.
ORM не делает безопасными raw-запросы, собранные строкой. Аналогично, хранимая процедура может быть уязвима, если внутри конкатенирует динамический SQL. Эти случаи нужно проверять отдельно.
Дополнительно ограничивают права роли приложения, не раскрывают подробные ошибки БД клиенту и проверяют запросы тестами и ревью. Логирование помогает расследованию, но секреты и лишние персональные данные в него не включают.
OWASP рассматривает параметризацию как основной подход. WAF может быть дополнительным слоем, но его отсутствие не мешает исправить первопричину инъекции.