Короткий ответ
SQL-инъекция — это внедрение произвольного SQL-кода через непроверенный пользовательский ввод, который подставляется в запрос как часть текста; код уязвим, потому что формирует SQL-строку через f-string вместо параметризованного запроса.
Как это работает подробнее
Если ввод пользователя напрямую вставляется в текст SQL-запроса, атакующий может передать фрагмент, который изменит логику запроса (например, добавит OR 1=1 или завершит запрос и начнёт новый).
Пример кода
example.py
# Пример намеренно уязвимого кода:
username = request.args["username"]
query = f"SELECT * FROM users WHERE username = '{username}'"
cursor.execute(query)
# username = "' OR '1'='1" вернёт всех пользователей вместо одного
# Безопасный вариант — параметризованный запрос:
query = "SELECT * FROM users WHERE username = %s"
cursor.execute(query, (username,))Что использовать на практике
- Практика. Защита — параметризованные запросы (placeholders), где драйвер БД сам экранирует значения и никогда не интерпретирует их как часть SQL-синтаксиса; ORM вроде SQLAlchemy/Django ORM по умолчанию параметризует запросы, но raw SQL и
text()всё ещё можно использовать небезопасно.
Подводные камни
- Риск. Считают, что экранирование кавычек вручную достаточно безопасно; доверяют «внутренним» данным без параметризации; используют f-строки/
%-форматирование для построения SQL с пользовательским вводом.