Вопрос проверяет понимание одной из самых распространённых уязвимостей веб-приложений и умение защищаться от неё на уровне кода и инфраструктуры.
SQL-инъекция возникает, когда приложение строит SQL-запрос путём конкатенации строк с пользовательским вводом. Если ввод не экранирован, атакующий может подменить логику запроса и выполнить произвольные команды над базой данных.
Рассмотрим типичный небезопасный код на Python:
username = input("Введите логин: ")
query = "SELECT * FROM users WHERE name = '" + username + "'"
cursor.execute(query)Если пользователь введёт ' OR '1'='1, итоговый запрос станет таким:
SELECT * FROM users WHERE name = '' OR '1'='1'Условие всегда истинно, и атакующий получит все записи таблицы. Через UNION SELECT можно вытащить данные из других таблиц, а через ; — выполнить дополнительные команды.
# Параметризованный запрос — ввод передаётся отдельно
cursor.execute(
"SELECT * FROM users WHERE name = %s",
(username,)
)
# Для динамических колонок — whitelist
allowed = {"name", "email", "created_at"}
if sort_by not in allowed:
raise ValueError("Недопустимая колонка")
query = f"SELECT * FROM users ORDER BY {sort_by}"Дополнительно помогают WAF, логирование подозрительных запросов и регулярные аудиты кода. Но базовая защита всегда должна быть на уровне приложения.
Итог: применяйте параметризованные запросы везде, где это возможно, а динамические части SQL строго валидируйте по whitelist — это закрывает подавляющее большинство сценариев SQL-инъекций.
Уровень
Рейтинг:
5
Сложность:
4
Навыки
Postgres
SQL
Ключевые слова
Подпишись на Node.js Developer в телеграм