Главная / Словарь / SQL-инъекция
Атаки на веб-приложения · Словарь ИБ

SQL-инъекция и XSS: атаки на веб-приложения

Проверено экспертной редакцией SecRadar · по первоисточникам ФСТЭК / ФСБ / Банка России

SQL-инъекция (SQLi) и межсайтовый скриптинг (XSS) — две старейшие и до сих пор массовые атаки на веб-приложения, обе входят в категорию Injection рейтинга OWASP Top 10. Обе эксплуатируют одну и ту же слабость — недостаточную проверку пользовательского ввода, — но бьют по разным целям: SQLi атакует базу данных на сервере, XSS выполняется в браузере другого пользователя.

Материал разбирает механику, виды и защиту обеих атак, с основным фокусом на SQL-инъекции.

Экспертная редакция SecRadar · как мы проверяем факты → Обновлено 11 июля 2026 · ~12 мин чтения сверено по OWASP, CWE и общепринятой терминологии ИБ

Кратко

SQL-инъекция
Внедрение SQL-кода через поле ввода, которое приложение не проверяет, — цель атаки: база данных на сервере.
Виды SQLi
Классическая (in-band) — ответ виден сразу; слепая (blind) — по признакам true/false или задержке; out-of-band — по отдельному каналу (DNS, HTTP).
XSS
Внедрение JavaScript-кода, который выполняется в браузере жертвы, — цель атаки: сессия и данные пользователя, не сервер.
Виды XSS
Отражённый (reflected) — через ссылку с полезной нагрузкой; хранимый (stored) — скрипт сохранён на сервере; DOM-based — уязвимость целиком в клиентском коде.
Категория OWASP
Обе относятся к категории Injection (A05 в редакции OWASP Top 10 2025, ранее A03:2021) — атакам через недостаточно проверенный пользовательский ввод.
Основная защита
Для SQLi — параметризованные запросы (prepared statements); для XSS — экранирование вывода и Content Security Policy; в обоих случаях WAF — дополнительный, не основной рубеж.

Что такое SQL-инъекция

SQL-инъекция (SQL injection, SQLi) — это атака на веб-приложение, при которой злоумышленник внедряет вредоносный SQL-код в поля ввода, чтобы обмануть базу данных и получить, изменить или удалить данные, к которым у него нет доступа. Причина — недостаточная проверка пользовательского ввода: приложение принимает то, что ввёл пользователь, и подставляет это напрямую в текст SQL-запроса, вместо того чтобы обработать как значение, отдельное от кода команды.

Атака возможна везде, где веб-приложение строит SQL-запрос из непроверенного пользовательского ввода: форма логина, поле поиска, параметр в URL, cookie, HTTP-заголовок. Если СУБД выполняет получившийся запрос буквально — включая ту часть, которую туда дописал атакующий, — граница между «данными» и «командой» стирается, и злоумышленник фактически получает возможность выполнять собственные SQL-команды от имени приложения.

факт определение SQL injection и его причина — CWE-89, OWASP, общепринятая терминология ИБ

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

Механика SQL-инъекции строится на разрыве кавычек и логики условия внутри запроса, который приложение собирает из строк: атакующий вставляет в поле ввода символ, закрывающий ожидаемое значение раньше времени, а затем дописывает собственный код, который СУБД воспринимает как часть исходного запроса.

Классический учебный пример — форма логина, где запрос на сервере собирается конкатенацией строк:

SELECT * FROM users WHERE login = 'ВВОД_ПОЛЬЗОВАТЕЛЯ' AND password = '...'

Если приложение подставляет ввод без проверки, а атакующий вместо логина вводит ' OR 1=1 --, итоговый запрос превращается в:

SELECT * FROM users WHERE login = '' OR 1=1 --' AND password = '...'

Одинарная кавычка закрывает строковое значение раньше, чем рассчитывал разработчик, условие 1=1 истинно всегда, а -- комментирует остаток строки — в том числе проверку пароля. В результате запрос возвращает первую строку из таблицы пользователей без единой правильной пары логин/пароль, и атакующий заходит под чужой учётной записью.

Почему это работает. СУБД не различает «код запроса, который написал разработчик» и «данные, которые ввёл пользователь», если приложение само не провело эту границу заранее. Одинарная кавычка, точка с запятой и SQL-комментарий — базовый набор символов, с которых начинается практически любая проверка приложения на уязвимость к SQL-инъекции.
факт механика внедрения через конкатенацию строк и пример ' OR 1=1 -- — учебный пример, общепринятый в материалах OWASP и профильной литературе по безопасности БД

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

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

↔ таблицу можно прокрутить вбок

ВидКак получают результатКогда применяется
Классическая (in-band)Результат виден напрямую в ответе страницы — в данных или в тексте ошибки СУБДСамый простой для эксплуатации случай; включает подтип UNION-based, когда данные извлекаются через оператор UNION
Слепая (blind)Ответ не показывает данные и ошибки — только косвенные признаки: разное поведение страницы (boolean-based) или разница во времени ответа (time-based)Когда приложение не выводит ошибки СУБД и не показывает результат запроса напрямую, но реагирует на внедрённое условие иначе
Out-of-bandРезультат передаётся по отдельному каналу — например, СУБД инициирует DNS- или HTTP-запрос к серверу атакующего, в котором закодированы похищенные данныеКогда ни прямой ответ, ни разница в поведении/времени недоступны атакующему, но СУБД умеет делать исходящие сетевые запросы

Внутри слепой SQL-инъекции разделяют два приёма: boolean-based — атакующий по очереди задаёт истинные и ложные условия и смотрит, отличается ли ответ страницы (например, показан результат или пустая страница), и time-based — использует функции задержки СУБД, чтобы по времени ответа сервера понять, было условие истинным или нет, даже если содержимое страницы всегда одинаковое.

факт классификация SQLi на in-band/blind/out-of-band и подтипы UNION/boolean/time-based — общепринятая классификация OWASP и профильных источников по безопасности БД

XSS: межсайтовый скриптинг

XSS (Cross-Site Scripting, межсайтовый скриптинг) — это атака, при которой злоумышленник внедряет вредоносный JavaScript-код в веб-страницу, и этот код выполняется в браузере другого пользователя, а не на сервере. Итог для жертвы — кража сессионных cookie и токенов авторизации, перехват вводимых данных, подмена содержимого страницы или выполнение действий от имени жертвы без её ведома.

Причина та же, что у SQL-инъекции — недостаточная проверка и обработка пользовательского ввода, только уязвимое место другое: приложение выводит непроверенные данные (введённые пользователем или взятые из параметра URL) обратно в HTML-страницу, и браузер жертвы интерпретирует их не как текст, а как исполняемый код.

Виды XSS различаются тем, откуда берётся вредоносный код и как он попадает в браузер жертвы:

Отражённый reflected

Вредоносный код передаётся в самом запросе — обычно в параметре ссылки — и сервер немедленно «отражает» его обратно в HTML-ответе без проверки. Атака требует, чтобы жертва перешла по специально составленной ссылке, часто присланной в фишинговом письме или сообщении.

Хранимый stored

Вредоносный код сохраняется на сервере — в комментарии, профиле пользователя, отзыве, поле формы — и выполняется в браузере каждого, кто откроет страницу с этим содержимым. Не требует специальной ссылки и потому опаснее: жертвой становится любой посетитель страницы.

DOM-based

Уязвимость целиком в клиентском JavaScript-коде страницы: скрипт на стороне браузера сам берёт непроверенные данные (например, из URL) и вставляет их в DOM, минуя сервер полностью — сервер может быть полностью корректен, а страница всё равно уязвима.

факт определение XSS и классификация reflected/stored/DOM-based — CWE-79, OWASP, общепринятая терминология ИБ

Чем XSS отличается от SQL-инъекции

Ключевое отличие — цель атаки: SQL-инъекция бьёт по базе данных на сервере, XSS — по браузеру и сессии конкретного пользователя. Обе используют один и тот же корневой недостаток — приложение не проверяет и не обрабатывает должным образом пользовательский ввод, — но результат внедрения выполняется в разных средах и с разными последствиями.

↔ таблицу можно прокрутить вбок

ПараметрSQL-инъекцияXSS
Куда внедряется кодВ SQL-запрос, который выполняет СУБД на сервереВ HTML/JavaScript-страницу, которую выполняет браузер жертвы
Где выполняетсяНа сервере, внутри базы данных приложенияВ браузере другого пользователя, не на сервере
Основная цель атакующегоДоступ к чужим данным в БД, их изменение или удалениеКража сессии/cookie, действия от имени жертвы, подмена контента
Кто жертваОрганизация — владелец базы данных и приложенияКонкретный пользователь, чей браузер выполнил скрипт
Базовая защитаПараметризованные запросы (prepared statements)Экранирование вывода, Content Security Policy
факт сопоставление целей и сред выполнения SQLi и XSS — синтез определений из CWE-89 и CWE-79

Как защититься от обеих атак

Основная защита от SQL-инъекций и XSS находится в коде приложения, а не в отдельном защитном продукте — это параметризация запросов для SQLi и корректная обработка вывода для XSS. Средства сетевой защиты снижают риск дополнительно, но не заменяют исправление уязвимости в самом приложении.

Для SQLi

Параметризованные запросы

Prepared statements передают пользовательский ввод в СУБД как значение параметра, а не как часть текста SQL-команды — сама конструкция запроса при этом не может быть изменена вводом.

Для XSS

Экранирование вывода и CSP

Экранирование спецсимволов HTML при выводе непроверенных данных плюс Content Security Policy, ограничивающая, какой код вообще может выполняться на странице.

Для обеих

Валидация ввода

Проверка формата, длины и допустимых символов на входе — не замена параметризации и экранирования, а дополнительный барьер до того, как данные вообще попадут в запрос или в вывод.

Дополнительно

WAF

Web Application Firewall фильтрует известные паттерны SQLi и XSS на уровне HTTP-трафика — полезный дополнительный рубеж, в том числе на время исправления уже найденной уязвимости, но не замена защиты внутри кода.

На портале класс WAF — основная техническая защита веб-приложений на сетевом уровне: там же обзор продуктов, которые фильтруют SQLi- и XSS-паттерны в трафике. Отдельная задача — защита API, где та же логика инъекций применима к параметрам запросов и телу JSON-запроса: закрывается классом API Security.

Оба технических средства снижают риск на уровне трафика, но не устраняют корень проблемы — уязвимый код. Системная защита начинается раньше, на этапе разработки: практики безопасной разработки (РБПО) описывают, как встроить параметризацию запросов, экранирование вывода и статический анализ кода в сам процесс разработки, а не добавлять их постфактум.

Проверить, что эти практики действительно работают на конкретном приложении, позволяет пентест — тестирование на проникновение, которое ищет SQLi, XSS и другие инъекции тем же способом, что и реальный атакующий.

факт роль prepared statements, экранирования вывода и CSP как основной защиты — OWASP Cheat Sheet Series (SQL Injection Prevention, XSS Prevention) оценка место WAF, API Security, РБПО и пентеста в общей схеме защиты — редакционная систематизация, не заменяет продуктовую консультацию

Связь с OWASP Top 10

SQL-инъекция и XSS относятся к категории Injection в рейтинге OWASP Top 10 — списке наиболее критичных рисков безопасности веб-приложений, который проект OWASP регулярно обновляет. В версии OWASP Top 10 2021 года эта категория обозначена как A03:2021-Injection и объединяет все атаки, где причина одна и та же — непроверенный пользовательский ввод исполняется как код: SQL-, NoSQL-, OS command-инъекции и, начиная с редакции 2021 года, также межсайтовый скриптинг, который в более ранних версиях рейтинга (2013, 2017) выделялся в отдельную категорию.

Смежная тема, которая не входит в фокус этого материала, — как OWASP Top 10 устроен целиком, какие ещё категории риска в него входят и как рейтинг применяют для приоритизации в собственном проекте безопасной разработки; отдельный разбор всех десяти категорий — на профильной странице словаря OWASP Top 10.

факт категория A03:2021-Injection и включение XSS в неё с редакции 2021 года — owasp.org, официальный документ OWASP Top 10

Частые вопросы

Что такое SQL-инъекция простыми словами?
SQL-инъекция — это когда злоумышленник вписывает в обычное поле ввода на сайте (логин, поиск, форму заказа) кусок SQL-кода вместо ожидаемых данных. Если приложение не проверяет ввод, база данных выполняет этот код как часть своего запроса — и в ответ может выдать чужие данные, изменить их или удалить, хотя у атакующего изначально не было на это прав. Метка: факт — общепринятое определение термина (CWE-89).
Чем XSS отличается от SQL-инъекции?
Обе атаки эксплуатируют недостаточную проверку пользовательского ввода, но бьют по разным целям. SQL-инъекция атакует базу данных на сервере — цель атакующего получить доступ к чужим данным через сервер приложения. XSS атакует браузер другого пользователя — вредоносный код выполняется не на сервере, а в сессии жертвы, и крадёт её куки, токены или данные прямо в браузере. Метка: факт — сопоставление по CWE-89 и CWE-79.
Как защититься от SQL-инъекций?
Основная защита — параметризованные запросы (prepared statements): пользовательский ввод передаётся в базу данных как значение параметра, а не как часть текста SQL-команды, поэтому даже вредоносная строка не может изменить логику запроса. Дополняют это ORM-библиотеки, принцип минимальных привилегий для учётной записи БД и WAF как дополнительный, а не основной рубеж защиты. Метка: факт — OWASP Cheat Sheet Series (SQL Injection Prevention).
Что такое слепая SQL-инъекция?
Слепая (blind) SQL-инъекция — вид атаки, при котором приложение не показывает атакующему ни данные из базы, ни текст ошибки СУБД. Он подбирает информацию по косвенным признакам: по разнице в поведении страницы (истина/ложь на условный запрос) или по задержке ответа сервера (time-based), когда внедрённый код намеренно замедляет выполнение при выполнении условия. Метка: факт — общепринятая классификация SQLi (OWASP).
Что такое хранимый XSS?
Хранимый (stored) XSS — вид межсайтового скриптинга, при котором вредоносный скрипт сохраняется на сервере (в комментарии, профиле, отзыве) и затем выполняется в браузере каждого пользователя, который откроет страницу с этим содержимым — без дополнительных действий со стороны жертвы, в отличие от отражённого XSS, где нужен переход по специально составленной ссылке. Метка: факт — CWE-79, классификация OWASP.
Может ли WAF полностью защитить от SQL-инъекций и XSS?
Нет. WAF фильтрует известные паттерны атак на уровне HTTP-трафика и снижает риск, но не устраняет уязвимость в коде приложения. Основная защита — параметризованные запросы для SQLi и корректное экранирование вывода для XSS на уровне самого приложения; WAF работает как дополнительный рубеж, в том числе для уже выявленных, но ещё не исправленных уязвимостей. Метка: оценка — редакционная систематизация роли WAF.
Входят ли SQL-инъекция и XSS в OWASP Top 10?
Да. SQL-инъекция относится к категории Injection (в актуальной версии OWASP Top 10 — A03:2021), которая объединяет все атаки, использующие внедрение постороннего кода через непроверенный ввод, включая SQL-, NoSQL- и command-инъекции. XSS исторически выделялся в отдельную категорию, а в OWASP Top 10 2021 года объединён с Injection по той же общей причине — недостаточной проверке и обработке пользовательского ввода. Метка: факт — owasp.org, официальный документ OWASP Top 10.

Словарь терминов ИБ на SecRadar

SQL-инъекция, XSS и другие атаки на приложения — независимые разборы без привязки к вендору, с прямыми ссылками на классы СЗИ, которые закрывают конкретную угрозу.

Открыть словарь
Telegram-канал SecRadar
Сводка рынка ИБ России — каждую неделю

Новые продукты и сертификаты ФСТЭК, ходы вендоров, дедлайны регуляторов — коротко и со ссылками на первоисточники.

Подписаться →