Защита от XSS: что стоит пробовать и на что забить
Ну XSS — это штука достаточно древняя, но по-прежнему бьёт по голове тем, кто забивает на простейшие меры. Я бы выделил несколько способов защиты, которые реально помогают, и пару вариантов, которые либо лишние, либо костыль.
1. Экранирование вывода. Самый простой и рабочий способ — перед тем как вставить в HTML любые данные от пользователя, их надо обязательно пропустить через htmlspecialchars или аналог в вашем языке. Это снижает риск почти всех отражённых XSS, и с ним мало кто спорит.
2. CSP (Content Security Policy). Не самая лёгкая штука для настройки, но сильно помогает ограничить, что вообще браузер сможет выполнить на вашей странице. Например, блокирует встроенный JS и внешние неразрешённые скрипты. Однако, если правило зажать чересчур жестко, можно сломать что-то в интерфейсе.
3. Валидация и фильтрация на бекенде. Всякие strpos, regex и готовые санитайзеры обычно нужны, если вы что-то сохраняете и потом используете в опасных местах. Но лучше не пытаться слишком сильно чистить, а просто фильтровать формат входящих данных.
4. HTTPOnly и Secure cookie. Это больше про защиту сессий от кражи через JS, если XSS всё-таки проскочит. Хорошая практика, без вопросов.
5. Фреймворки и шаблонизаторы с защитой по умолчанию. Например, если на PHP использовать Twig, или на JS React — там данные по умолчанию эскейпятся. Полезно не изобретать велосипед.
Что у меня лично вызывает скепсис — это всякие "защиты" через JavaScript, типа удаления подозрительных тегов на клиенте или собственные извращённые фильтры. Это либо слишком слабо, либо создаёт дыру.
Подводя итог — стоит ли использовать защиту? Да, но начинать надо с простого: правильное экранирование, CSP и нормальные куки. Остальное — уже по ситуации. Кто как ещё думает? Какие у вас были реальные случаи с XSS и как прятались?