Короткий ответ
XSS (межсайтовый скриптинг) — внедрение вредоносного JavaScript в страницу через непроверенный пользовательский ввод, который браузер жертвы затем выполняет; Jinja2 по умолчанию автоматически экранирует HTML-спецсимволы при выводе переменных в шаблон, превращая потенциальный тег <script> в безопасный текст.
Как это работает подробнее
Автоэкранирование заменяет символы <, >, &, \" на HTML-сущности перед вставкой в разметку, поэтому введённая пользователем строка отображается как текст, а не исполняется как HTML/JS.
Пример кода
example.txt
{# comment содержит: <script>alert(1)</script> #}
Безопасно (автоэкранирование включено):
{{ comment }}
--> <script>alert(1)</script> (отображается как текст, не выполняется)
Уязвимо (защита намеренно отключена):
{{ comment | safe }}
--> <script>alert(1)</script> (выполнится в браузере жертвы)Что использовать на практике
- Практика. Автоэкранирование защищает только вывод непосредственно в HTML-тело; при выводе в атрибуты, JavaScript-блоки или через
|safe/Markupзащита отключается, и такие места нужно проверять особенно внимательно; дополнительно помогает заголовок Content-Security-Policy.
Подводные камни
- Риск. Отключают автоэкранирование (
|safe) для пользовательского контента «чтобы форматирование работало»; считают, что XSS актуален только для фронтенда, хотя backend отвечает за корректный рендеринг шаблонов и заголовки безопасности; не экранируют данные, вставляемые в JSON, встроенный в HTML.