SQL-инъекция: чем опасна и как закрыть
SQL-инъекция — уязвимость, при которой введённый посетителем текст попадает в запрос к базе данных не как значение, а как часть команды. В результате посторонний может прочитать, изменить или удалить то, к чему у него не должно быть доступа.
Аналогия для владельца сайта
Есть архив и бланк: «принесите дело номер ___». Если в графу с номером кто-то допишет «…а заодно вынесите весь шкаф и оставьте дверь открытой», а сотрудник прочитает бланк целиком как поручение — он это сделает. Уязвим не архив, а привычка склеивать поручение из чужого текста. Решение — форма, где номер дела всегда остаётся номером и никогда не читается как команда.
Что при этом можно потерять
| Что происходит | Чем оборачивается |
|---|---|
| Чтение чужих таблиц | Утечка базы клиентов и заказов — а с ней уведомления людям и вопросы регулятора |
| Доступ к учётным записям | Хэши паролей администраторов, вход в админку, контроль над сайтом |
| Запись постороннего кода в базу | Заражение, которое возвращается даже после чистки файлов — см. вредоносный код на сайте |
Как это бьёт по SEO
Прямого фактора ранжирования здесь нет — бьёт последствие. Через инъекцию в базу заливают спам-контент и скрытые ссылки на чужие темы. Дальше типовой сценарий: поиск переоценивает тематику сайта, позиции проседают, часть страниц выпадает из индекса, а при попадании домена в базы небезопасных сайтов браузеры показывают предупреждение и трафик обрывается.
Как это выглядит в отчёте Security Shield
Сканер отправляет один безобидный пробный запрос к найденным параметрам и смотрит, не вернёт ли сайт текст ошибки базы данных. Если вернул — появляется находка «Признак SQL-инъекции (ошибка БД)»: высокая серьёзность, класс CWE-89, категория OWASP A03:2021. В доказательстве виден фрагмент ошибки, а пометка «требует проверки» означает, что сервис фиксирует симптом, а не взламывает базу.
Проба выполняется только в платных режимах и на подтверждённом домене. Сканер смотрит снаружи и видит лишь те параметры, которые нашёл на страницах, — отсутствие находки не означает, что инъекций нет нигде. Что именно проверяется — в статье про Security Shield.
Ошибка базы в ответе означает, что чужой текст дошёл до запроса. Передайте разработчику адрес страницы и имя параметра из отчёта. Ручное экранирование кавычек и «чёрные списки» слов тут не решение.
Как закрыть
- Параметризованные запросы. Главное решение: текст запроса задаётся заранее, а значения передаются отдельно — подготовленным выражением. Тогда содержимое поля физически не может стать частью команды.
- ORM или запросный слой фреймворка. Современные библиотеки делают это по умолчанию; проблемы возникают там, где запрос собрали строкой вручную.
- Минимальные права пользователя базы. Учётной записи сайта почти никогда не нужны права на удаление таблиц и работу с файлами.
- Скройте технические ошибки от посетителя — отладочный вывод должен уходить в лог, а не на страницу.
- Обновите CMS и расширения. На типовых сайтах инъекция чаще приходит с уязвимым плагином, чем из вашего кода.
Как не допустить повторно
Договоритесь с разработчиком, что запросы, собранные конкатенацией строк, не проходят ревью. Файрвол перед сайтом — мера на время правки, а не замена подготовленным выражениям. После правки повторите глубокий скан. Полезно свериться и с аудитом сайта — он покажет посторонние страницы и ссылки, если что-то уже попало в базу.