SQL-инъекция (SQLi) — атака, при которой злоумышленник вставляет SQL-код в пользовательские поля формы. Пример: поле логина с вводом ' OR '1'='1 при конкатенации строк превращает запрос SELECT * FROM users WHERE login='admin' OR '1'='1' — аутентификация обходится. SQLi занимает первое место в OWASP Top 10 с 2003 года.
Как работает защита
Параметризованные запросы (Prepared Statements) — правильный метод: SQL-код и данные передаются раздельно. Драйвер базы данных экранирует данные автоматически.
$stmt = $pdo->prepare("SELECT * FROM users WHERE login = ?");
$stmt->execute([$login]);ORM (Eloquent, Doctrine, SQLAlchemy) — автоматически используют параметризованные запросы, полностью убирая риск SQLi при стандартном использовании.
WAF (Imunify360, ModSecurity, Cloudflare WAF) — дополнительный уровень: анализирует HTTP-запросы, блокирует паттерны SQLi. Не заменяет параметризованные запросы в коде.
Минимальные привилегии: пользователь БД для веб-приложения должен иметь только SELECT/INSERT/UPDATE, не GRANT, DROP, CREATE.
История
SQL-инъекции описаны Рейнхардом Вёрнером в 1998 году. Атаки использовались против крупных сайтов в 2000-х: взлом Sony PlayStation Network (2011) — 77 млн аккаунтов, частично через SQLi. OWASP включает SQLi в Top 10 с момента основания списка в 2003 году.
Виды SQL-инъекций
- Classic (In-band) — результат запроса виден в ответе.
- Blind — ответ не показывает данные, но меняет поведение приложения (TRUE/FALSE).
- Time-based — задержка ответа:
SLEEP(5)подтверждает уязвимость. - Out-of-band — данные экфильтруются через DNS или HTTP-запросы.
Связь с хостингом
На хостинге с MySQL или PostgreSQL защита от SQLi — ответственность разработчика приложения, не хостера. Хостер добавляет WAF как дополнительный слой. WordPress использует $wpdb->prepare() для безопасных запросов; проблемы возникают в плагинах с самописными SQL-запросами.
Ключевые отличия от похожих терминов
XSS (Cross-Site Scripting) — внедрение JavaScript в страницу, атакует пользователя. SQLi — атакует базу данных, экфильтрует или модифицирует данные. CSRF — подделка запроса от имени пользователя. Все три входят в OWASP Top 10.
Типы SQL-инъекций
In-band: результат инъекции возвращается напрямую (Error-based, Union-based). Inferential (Blind): результат не виден, но можно извлечь данные через True/False-запросы или time-based задержки. Out-of-band: данные извлекаются через DNS или HTTP к внешнему серверу.
Защита на уровне кода
Prepared statements (параметризованные запросы) — единственная надёжная защита: $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$id]);. ORM (Eloquent, Doctrine) — параметризация по умолчанию. Экранирование — ненадёжно, не рекомендуется как единственная мера.
Дополнительные уровни защиты
WAF блокирует известные паттерны SQL-инъекций. Минимальные привилегии пользователя БД: только SELECT/INSERT/UPDATE на нужные таблицы, без GRANT, FILE, DROP. Регулярное сканирование: sqlmap, Burp Suite. Imunify360 для shared-хостинга.