hostprofi.ru
Подобрать хостинг
Термин

SQL-инъекция

краткое определение

SQL-инъекция — уязвимость, позволяющая выполнить произвольный SQL-код через пользовательский ввод. Единственная надёжная защита — параметризованные запросы (Prepared Statements).

SQL-инъекция (SQLi) — уязвимость веб-приложения, позволяющая атакующему внедрить произвольный SQL-код в запрос к базе данных. По данным OWASP Top 10 2021, инъекции занимают третье место среди критических веб-уязвимостей. Эксплуатация — от утечки данных до полного захвата сервера.

Как работает SQL-инъекция

Уязвимый PHP-код передаёт пользовательский ввод напрямую в SQL:

// УЯЗВИМО
$query = "SELECT * FROM users WHERE login='" . $_GET['user'] . "'";

Ввод атакующего: ' OR '1'='1
Итоговый запрос: SELECT * FROM users WHERE login='' OR '1'='1' — возвращает всех пользователей.
Более опасный ввод: '; DROP TABLE users; -- — удаляет таблицу (при наличии прав).

Виды SQL-инъекций

  • Classic / In-band: результат виден в ответе приложения (UNION SELECT для извлечения данных).
  • Blind Boolean-based: результат угадывается по изменению поведения приложения (истина/ложь).
  • Blind Time-based: используется SLEEP(5) — задержка ответа подтверждает инъекцию.
  • Out-of-band: данные извлекаются через DNS-запросы или HTTP от имени сервера БД.
  • Second-order: вредоносный ввод сохраняется в БД и эксплуатируется позже другим запросом.

Защита от SQL-инъекций

  1. Параметризованные запросы (Prepared Statements) — единственная надёжная защита:
// БЕЗОПАСНО — PHP PDO
$stmt = $pdo->prepare('SELECT * FROM users WHERE login = ?');
$stmt->execute([$login]);

// БЕЗОПАСНО — PHP MySQLi
$stmt = $mysqli->prepare('SELECT * FROM users WHERE login = ?');
$stmt->bind_param('s', $login);
$stmt->execute();
  1. ORM: Eloquent (Laravel), Doctrine (Symfony), SQLAlchemy (Python) генерируют параметризованные запросы автоматически.
  2. Принцип минимальных привилегий: пользователь БД для приложения не должен иметь права DROP, ALTER, FILE.
  3. WAF (Web Application Firewall): блокирует типичные паттерны SQLi на уровне HTTP-запросов.
  4. Валидация ввода: белые списки допустимых символов для идентификаторов и числовых полей.

История

Первое публичное описание SQL-инъекций — статья Jeff Forristal в Phrack Magazine (#54, декабрь 1998 года). OWASP включил SQL injection в Top 10 с первого выпуска в 2003 году. Крупнейшие взломы через SQLi: Heartland Payment Systems (2008, 130 млн карт), Sony PlayStation Network (2011, 77 млн аккаунтов), Adobe (2013, 153 млн записей).

Инструменты для тестирования

sqlmap — автоматизированный инструмент обнаружения SQLi. Используется в рамках пентестинга с разрешения владельца сервера. Сканирует параметры GET/POST/Cookie на все виды инъекций, автоматически извлекает данные. Проверка защиты приложения через OWASP ZAP или Burp Suite Community Edition — стандартная практика перед production-деплоем.

Автоматическое обнаружение и DevSecOps

Статический анализ кода (SAST) находит потенциальные SQLi в коде до деплоя: PHP CodeSniffer с плагинами, Psalm, PHPStan. В CI/CD-пайплайне (CI/CD) SAST-инструменты запускаются автоматически при каждом коммите. Динамическое тестирование (DAST) — sqlmap, OWASP ZAP — сканирует работающее приложение. На уровне VPS: ModSecurity (Apache/Nginx WAF) с правилами OWASP Core Rule Set блокирует типовые SQLi без изменения кода приложения.

Другие термины