Rostelecom Security Labs

SecureCode Review — Spring MVC

Проводим ревью контроллера превью статей. Разработчик пробрасывает HTML в шаблон через th:utext. Ваша задача — найти опасную строку и предложить фикс.

📚 Теория: XSS в Spring MVC и шаблонах (раскрыть)

Контроллер

В MVC model.addAttribute() просто кладёт объект в модель. Servlet контейнер не добавляет экранирование сам — это задача разработчика.

⚠️ Если значение попадает в HTML, его нужно экранировать или отфильтровать.

Шаблон

Thymeleaf по умолчанию экранирует th:text, но th:utext вставляет строку как HTML. Это сделано для доверенных фрагментов.

🚫 Никогда не используйте th:utext с пользовательским вводом.

1. Пользователь

Отправляет <script>fetch('/steal?c='+document.cookie)</script>

2. Контроллер

Кладёт строку в модель без экранирования.

3. Thymeleaf

Через th:utext вставляет payload в DOM, скрипт выполняется.

Правильный подход: либо использовать th:text (экранированный вывод), либо очищать HTML-белым списком. Для простого текста хватит HtmlUtils.htmlEscape(body) перед помещением в модель.

Контекст

Редактор новостей отправляет черновик на endpoint /preview, чтобы отрендерить быстрый просмотр. Разработчик решил, что редакторы «свои» и можно доверять вводу. В итоге модель получает HTML без фильтрации, а шаблон выводит его через th:utext, что даёт XSS.

Сниппет

Загружаем сниппет…

Code Review

Проверка флага

Флаг фиксирует, что ревью завершено. Сдаём его в платформе, чтобы получить +1 лабораторию в прогрессе.