SQL-инъекция (SQLi)
Внедрение SQL-кода через непроверенный ввод, позволяющее изменить логику запроса к базе данных.
Сигнатура
SQL InjectionSQL-инъекция возникает, когда пользовательский ввод напрямую склеивается в текст SQL-запроса. Злоумышленник может изменить логику запроса: обойти аутентификацию, прочитать чужие данные или повредить таблицы.
Как защититься: используйте параметризованные запросы (prepared statements), при которых данные передаются отдельно от текста запроса и не могут стать частью кода. Дополнительно применяйте ORM, валидацию ввода и принцип наименьших привилегий для учётной записи БД.
# Опасно: ввод склеивается со строкой запроса
login = request.get("login")
query = "SELECT * FROM users WHERE login = '" + login + "'"
cursor.execute(query) # ввод admin' -- ломает логику
# Безопасно: параметризованный запрос
login = request.get("login")
cursor.execute("SELECT * FROM users WHERE login = %s", (login,))