FlawOpen

flawopen.com/XSS в JavaScript/Svelte

Защищает ли Svelte от XSS по умолчанию?

Справочная страница
Простыми словами

Представьте `{comment}` как напечатанную записку: угловые скобки остаются видимым текстом. `{@html comment}` — это просьба к наборщику трактовать знаки на странице как инструкции разметки. Если они поступили из недоверенного источника, браузер может интерпретировать их как HTML и создать XSS.

РИСК
<p>{@html comment}</p>
// значение интерпретируется как настоящая HTML-разметка
БЕЗОПАСНО
<p>{comment}</p>
// автоматически экранируется

Правило

Svelte компилирует обычный вывод {expression} как экранированный текст, поэтому значение не интерпретируется как HTML-разметка. Напротив, {@html} намеренно выводит строку HTML. Документация Svelte предупреждает: для предотвращения XSS значение нужно экранировать или контролировать. Считайте эту директиву чувствительной к безопасности точкой вставки HTML и используйте поддерживаемый санитайзер для форматированного текста от пользователей.

Как проверить код

Найдите `{@html}` в файлах `.svelte`. Для каждого совпадения проследите источник значения и все его преобразования. Считайте пользовательский ввод, внешние данные и сохранённый пользовательский контент недоверенными. Если нужен обычный текст, используйте `{expression}`. Если необходим HTML с форматированием, обработайте его поддерживаемым HTML-санитайзером и проверьте удаление запрещённой разметки.

grep -rn "{@html" --include="*.svelte" .

HTML-разметка: сохраняйте границу санитизации

Используйте `{expression}`, если содержимое нужно показать как текст. Если пользователям нужно создавать HTML, санируйте готовое содержимое поддерживаемым HTML-санитайзером, например DOMPurify, перед передачей в `{@html}`. Не добавляйте к результату после санитизации другие данные и не изменяйте его: это может лишить защиту смысла. Своевременно обновляйте санитайзер и разрешайте только те элементы и атрибуты разметки, которые нужны продукту. Санитизация HTML не делает то же значение безопасным в контекстах JavaScript, CSS или URL.

Источники

См. также XSS (межсайтовый скриптинг, CWE-79): как он работает и как его предотвратить в любом языке — flawopen.com Опасна ли загрузка SVG из-за XSS? Риск XSS при использовании Vue v-html WKWebView: безопасен ли HTML? Отражённый, хранимый и DOM-based XSS: в чём разница? Риски безопасности addJavascriptInterface в Android Защита Angular от XSS: безопасные значения и обходные API