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

Защита

1. Экранирование по контексту

КонтекстЭкранирование
HTML body&lt; &gt; &amp; &quot;
HTML attribute+ &#39;, кавычки обязательны
JS string\x3C, \u0022
URL paramencodeURIComponent
CSShex-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.

См. также