XSS (Cross-Site Scripting) - вразливість, за якої нападник змушує сайт показати іншим користувачам свій JavaScript. Скрипт виконується в браузері жертви з правами вашого сайту: читає дані сторінки, робить запити від імені користувача, підміняє форми, краде токени з localStorage.
Три види:
- Збережений (stored) - шкідливий код зберігається на сервері: коментар, ім'я профілю, опис товару. Спрацьовує в кожного, хто відкриє сторінку. Найнебезпечніший.
- Відображений (reflected) - код приходить у параметрі запиту й одразу виводиться у відповіді:
/search?q=<script>...</script>. Жертву треба змусити перейти за посиланням. - DOM-based - вразливість повністю в клієнтському JavaScript: скрипт бере дані з
location.hashчи URL і вставляє черезinnerHTML, сервер навіть не бачить шкідливого вмісту.
Основний захист - екранування при виведенні відповідно до контексту:
{{ $comment->body }} {{-- Blade екранує HTML автоматично --}}
{!! $comment->body !!} {{-- небезпечно для даних користувача --}}
Додаткові рівні:
textContentзамістьinnerHTMLу JavaScript;- санітайзер (HTML Purifier, DOMPurify), якщо HTML від користувача справді потрібен;
- Content Security Policy, що забороняє інлайнові скрипти;
- cookie сесії з
HttpOnly- XSS не зможе її прочитати (хоча робити запити від імені користувача все одно зможе).
Контексти мають значення: екранування для HTML не захищає значення в атрибуті href (javascript:alert(1)), усередині <script> чи CSS. Для кожного контексту - свої правила.