Что такое XSS уязвимость
Что проверяют
Знаете ли вы, откуда в вашей странице берётся чужой скрипт, и защищаетесь ли системно. Java-разработчику одного определения мало: ждут, что вы назовёте конкретные места в шаблонизаторе и API, где дыра появляется сама собой.
Как отвечать
XSS это внедрение скрипта в страницу, которую браузер считает доверенной. Скрипт получает права пользователя: читает токены и куки, шлёт запросы от его имени, подменяет форму. Виды: хранимая, когда данные легли в базу и отдаются всем, отражённая, когда значение из запроса вернулось в ответ, и DOM-based, когда небезопасная запись в разметку происходит уже в браузере.
Главная защита это экранирование на выводе и по контексту, а не фильтрация на входе. Одному значению нужны разные правила в теле страницы, в атрибуте, в ссылке и внутри script.
Encode.forHtml(comment); // текст внутри элемента
Encode.forHtmlAttribute(value); // значение атрибута
Encode.forUriComponent(param); // часть ссылкиЧто сказать дальше: Thymeleaf экранирует в th:text и не экранирует в th:utext, в JSP выражения по умолчанию не экранируются и нужен c:out. Если пользователю действительно нужна разметка, текст пропускают через санитайзер со списком разрешённых тегов. Поверх ставят Content Security Policy, а куки сессии помечают HttpOnly и SameSite, чтобы кража токена перестала быть однострочной.
Где спотыкаются
Надеются на чёрный список и вырезание слова script. Обходов слишком много: обработчики событий в атрибутах, схема javascript: в ссылке, юникод, вложенные конструкции. Работает разрешительный подход: экранирование по контексту либо санитайзер с явным перечнем тегов.
Экранируют один раз при сохранении. В базе оказывается искажённый текст, в другом контексте вывода защита всё равно не работает, а при повторной обработке появляется двойное экранирование. Хранят исходное значение, преобразуют на выводе.
Считают XSS проблемой фронтенда. Разметку отдаёт серверный шаблон, заголовки безопасности и флаги кук выставляет бэкенд, а данные, попавшие в базу через неэкранированный вывод, останутся опасными для любого клиента, включая мобильный.