XSS: межсайтовый скриптинг простыми словами
XSS (cross-site scripting, межсайтовый скриптинг) — это когда посторонний добивается, чтобы на страницах вашего сайта в браузере посетителя выполнился его код. Уязвимость не в сервере, а в том, как сайт показывает данные, пришедшие извне: из адреса, формы, комментария или профиля.
Аналогия для владельца сайта
Представьте доску объявлений у входа в магазин. Если кто-то принесёт записку «выдайте предъявителю ключи от кассы», а вы повесите её не читая — сотрудник выполнит чужую инструкцию как вашу. XSS устроен так же: сайт вставляет чужой текст в страницу как свой, а браузер выполняет всё, что там оказалось, с полным доверием к вашему домену.
Какие бывают разновидности
| Вид | Где живёт | Кого затрагивает |
|---|---|---|
| Отражённый | Значение из адреса или формы возвращается прямо в HTML ответа | Того, кто перешёл по подготовленной ссылке |
| Хранимый | Чужой текст сохранился в базе — комментарий, отзыв, имя профиля | Каждого, кто откроет эту страницу |
| DOM-based | Скрипты сайта сами подставляют данные из адреса в разметку | Посетителей, при этом в ответе сервера следов не видно |
Чем это грозит
- Угон сессий. Чужой скрипт читает cookie и заходит в кабинет или админку от имени пользователя.
- Спам и скрытые ссылки. Сайт начинает продвигать посторонние темы и теряет доверие поиска.
- Метка в браузере и выдаче. Если через дыру внедрили вредоносный код, домен попадает в базы небезопасных сайтов, посетитель видит предупреждение «этот сайт может нанести вред», а страницы выпадают из индекса.
Как это выглядит в отчёте Security Shield
Сканер подставляет в параметры страниц безобидный маркер и смотрит, вернётся ли он в HTML без экранирования. Если вернулся — появляется находка «Признак отражённого XSS»: средняя серьёзность, класс CWE-79, категория OWASP A03:2021. Пометка «требует проверки» означает, что сервис видит поверхность, но не эксплуатирует её.
Активные пробы идут только в платных режимах и на подтверждённом домене — быстрая бесплатная проверка их не делает. Что ещё проверяется — в статье про Security Shield.
Откройте адрес и параметр из строки «Где найдено» и попросите разработчика проверить, экранируется ли это значение при выводе. Отражение сырого значения в HTML — сигнал, что фильтра здесь нет.
Как закрыть
- Экранируйте вывод. Данные от пользователя перед вставкой в HTML проходят контекстное кодирование: <, >, кавычки и амперсанд превращаются в безопасные последовательности. В шаблонизаторах это одна настройка.
- Проверяйте, что пришло. Если параметр — число, принимайте только число. Для текстов с разметкой берите проверенную библиотеку очистки HTML.
- Включите CSP — даже при промахе в шаблоне она не даст выполниться постороннему скрипту. С чего начать, описано в статье про заголовки безопасности.
- Закройте cookie флагами HttpOnly и Secure, чтобы сессию нельзя было прочитать из JavaScript.
- Обновите CMS, тему и плагины. Большая часть XSS на типовых сайтах приходит из чужого расширения.
Как не допустить повторно
Правило простое: каждое новое поле, которое видит посетитель, проходит через тот же безопасный вывод, что и остальные. Держите CSP включённой, повторяйте скан после релизов и установки плагинов. Полезен и SEO-аудит: внезапный рост числа внешних ссылок часто оказывается первым следом инъекции.