flawopen.com/XSS/Рендеринг Markdown
Защищает ли Markdown от XSS?
Считайте HTML, созданный из Markdown, недоверенным. Парсер может сохранять сырой HTML, поскольку синтаксис это допускает; преобразование Markdown не очищает результат. Парсер переводит разметку, но не служит защитным фильтром.
Где проходит граница доверия
Спецификация CommonMark предусматривает вывод сырого HTML, похожего на тег, без экранирования. Фактическое поведение зависит от парсера, настроек, плагинов и фреймворка. Например, Marked прямо предупреждает, что не очищает созданный HTML. Синтаксис Markdown не доказывает безопасность ввода; санитайзер должен защищать конечный HTML-приёмник.
Безопасный конвейер рендеринга
const html = marked.parse(userMarkdown); container.innerHTML = 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 — дополнительная защита, а не замена очистке.
Проверки перед выпуском
- ✓Зафиксируйте версию парсера Markdown и проверьте настройки сырого HTML, плагинов и URL.
- ✓Очищайте итоговый HTML поддерживаемым санитайзером со списком разрешений непосредственно перед HTML-приёмником.
- ✓Ограничьте элементы, атрибуты и схемы URL необходимыми возможностями.
- ✓Не меняйте и не разбирайте повторно очищенную разметку; после нужных преобразований очистите её снова.
- ✓Проверяйте точные настройки парсера и место вставки, обновляйте санитайзер.
Вопросы и ответы
Оно убирает одну возможность ввода, но само по себе не гарантирует безопасность. Проверьте ссылки, изображения, расширения, созданный HTML и контекст вставки; очищайте вывод для HTML-приёмника.
Лучше этого не делать. Последующие изменения могут добавить опасную разметку или отменить решения санитайзера. Выполняйте преобразования до очистки, которую проводите последней.
Нет. Применяйте его к HTML-фрагментам согласно документированной модели угроз, обновляйте, задавайте узкую политику и не используйте результат повторно в строках JavaScript или CSS.
Источники
- Спецификация CommonMark — сырой HTML
- Документация Marked — предупреждение о безопасности
- DOMPurify — README и рекомендации
- OWASP — предотвращение Cross-Site Scripting
- flawopen.com — Cross-Site Scripting