Что такое SQL Injection через заголовок referer и как защитить лог-файлы от внедрения вредоносного кода?
SQL Injection через заголовок Referer — это разновидность атаки внедрения SQL-кода, при которой злоумышленник манипулирует HTTP-заголовком Referer, передавая в нём вредоносные SQL-конструкции. Многие веб-приложения и серверные скрипты записывают значение этого заголовка в базу данных или лог-файлы без предварительной валидации, что открывает вектор для атаки.
**Как работает атака**
Заголовок Referer — стандартный HTTP-заголовок, который браузер отправляет серверу, указывая URL страницы, с которой был выполнен переход. Если серверный код выполняет запрос вида:
sql
INSERT INTO logs (referer) VALUES (‘$_SERVER[«HTTP_REFERER»]’);
…без экранирования, атакующий может подставить значение типа:
‘; DROP TABLE users; —
или более изощрённые конструкции для извлечения данных через UNION-запросы, слепые инъекции (Blind SQLi) и time-based атаки.
Атака особенно опасна тем, что Referer легко подделывается с помощью инструментов вроде Burp Suite, curl или простых Python-скриптов — никакой аутентификации для этого не требуется.
**Риски для лог-файлов**
Даже если данные пишутся не в базу, а в текстовые лог-файлы, существует угроза Log Injection: злоумышленник может вставить поддельные записи, скрыть следы своей активности, внедрить управляющие символы или, при последующем парсинге логов скриптом, спровоцировать выполнение вредоносного кода.
**Методы защиты**
1. **Параметризованные запросы (Prepared Statements)** — основной и наиболее надёжный способ. Никогда не подставляйте пользовательские данные напрямую в SQL-строку.
2. **Валидация и санитизация входных данных** — проверяйте Referer на соответствие ожидаемому формату URL с помощью регулярных выражений.
3. **Экранирование спецсимволов** — используйте функции типа `mysqli_real_escape_string()` или ORM-механизмы, если параметризация невозможна.
4. **Ограничение длины заголовка** — обрезайте значение Referer до разумной длины (например, 255 символов) перед записью.
5. **Защита лог-файлов** — фильтруйте управляющие символы (`
`, `
`, нулевые байты) перед записью в лог; используйте структурированные форматы логов (JSON) вместо plain-text.
6. **Принцип минимальных привилегий** — учётная запись базы данных, используемая приложением, не должна иметь права на DROP, ALTER и другие деструктивные операции.
7. **WAF (Web Application Firewall)** — дополнительный уровень защиты, способный блокировать характерные паттерны SQL Injection в заголовках.
8. **Регулярный аудит кода** — используйте статические анализаторы (например, SonarQube, Semgrep) для автоматического обнаружения уязвимых мест.
Комплексный подход, сочетающий параметризованные запросы, валидацию и мониторинг, позволяет надёжно защитить приложение от SQL Injection через Referer и связанных атак на лог-инфраструктуру.
