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-аудит: раптовий ріст кількості зовнішніх посилань часто виявляється першим слідом ін'єкції.