XSS
XSS (Cross-Site Scripting) — внедрение чужого JS в страницу. Полученный код выполняется в контексте жертвы, крадёт куки, делает действия от имени.
Типы
Reflected (отражённый)
Пейлоад в URL, сервер вернул его в HTML без экранирования.
https://site.com/search?q=<script>alert(1)</script>
# сервер рендерит: <div>Найдено: <script>alert(1)</script></div>
Stored (хранимый)
Пейлоад сохранён в БД (комментарий, профиль). Каждый посетитель получает.
DOM-based
JS сам вставляет user-input в DOM небезопасно.
document.getElementById('out').innerHTML = location.hash.slice(1)
// URL: page#<img src=x onerror=alert(1)>
Что можно сделать через XSS
- Украсть
document.cookie(если неHttpOnly) - Сделать XHR от имени юзера (перевести деньги, поменять email)
- Кейлоггер на форме логина
- Клипборд-хайджек
- Криптомайнер
Защита
1. Экранирование по контексту
| Контекст | Экранирование |
|---|---|
| HTML body | < > & " |
| HTML attribute | + ', кавычки обязательны |
| JS string | \x3C, \u0022 |
| URL param | encodeURIComponent |
| CSS | hex-escape нежелательных |
2. CSP
Content Security Policy с nonce — даже при XSS чужой скрипт не выполнится.
3. HttpOnly cookies
JS не может прочитать. Защита от кражи сессии.
4. Trusted Types (Chrome)
Запрещает string→sink (innerHTML) без явной санитизации.
5. Frameworks
React, Vue, Angular по умолчанию экранируют. Опасно только dangerouslySetInnerHTML, v-html, [innerHTML].
DOMPurify
Стандарт-де-факто санитизатор HTML на клиенте, если нужно всё-таки вставить пользовательский HTML.