FlawOpen

flawopen.com/XSS/Рендеринг Markdown

Защищает ли Markdown от XSS?

Справочное руководство
Краткий ответ

Считайте HTML, созданный из Markdown, недоверенным. Парсер может сохранять сырой HTML, поскольку синтаксис это допускает; преобразование Markdown не очищает результат. Парсер переводит разметку, но не служит защитным фильтром.

Где проходит граница доверия

Спецификация CommonMark предусматривает вывод сырого HTML, похожего на тег, без экранирования. Фактическое поведение зависит от парсера, настроек, плагинов и фреймворка. Например, Marked прямо предупреждает, что не очищает созданный HTML. Синтаксис Markdown не доказывает безопасность ввода; санитайзер должен защищать конечный HTML-приёмник.

Безопасный конвейер рендеринга

НЕБЕЗОПАСНО — вставка необработанного результата
const html = marked.parse(userMarkdown);
container.innerHTML = html; // результат парсера не очищен
ЗАЩИЩЕНО — очистка прямо перед HTML-приёмником
import DOMPurify from "dompurify";

const html = marked.parse(userMarkdown);
container.innerHTML = DOMPurify.sanitize(html, {
  USE_PROFILES: { html: true }
});

Пример использует профиль DOMPurify только для HTML: этому представлению не нужны SVG или MathML. Оставьте только нужные продукту возможности. Не изменяйте очищенную разметку и не передавайте её другой библиотеке, преобразующей HTML, до вставки: это может нарушить гарантии. Если форматированный HTML не нужен, используйте безопасный текстовый вывод фреймворка. Content Security Policy и Trusted Types — дополнительная защита, а не замена очистке.

Проверки перед выпуском

Вопросы и ответы

Делает ли отключение сырого HTML Markdown безопасным?

Оно убирает одну возможность ввода, но само по себе не гарантирует безопасность. Проверьте ссылки, изображения, расширения, созданный HTML и контекст вставки; очищайте вывод для HTML-приёмника.

Можно ли изменять HTML после очистки?

Лучше этого не делать. Последующие изменения могут добавить опасную разметку или отменить решения санитайзера. Выполняйте преобразования до очистки, которую проводите последней.

Делает ли DOMPurify любой результат безопасным в любом контексте?

Нет. Применяйте его к HTML-фрагментам согласно документированной модели угроз, обновляйте, задавайте узкую политику и не используйте результат повторно в строках JavaScript или CSS.

Источники

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