Библиотека Marked предоставляет мощные инструменты
для преобразования Markdown в HTML. Одним из критически важных аспектов
при работе с динамическим контентом является
безопасность. Markdown, полученный из ненадёжных
источников, может содержать вредоносный код, например XSS-скрипты. Для
управления безопасностью используется параметр sanitize и
связанные с ним методы фильтрации.
sanitizeПараметр sanitize предназначен для удаления
потенциально опасного HTML-кода при преобразовании Markdown в
HTML. Если установлен sanitize: true, библиотека
автоматически очищает все HTML-теги, оставляя только
безопасные Markdown-теги.
Пример использования:
const marked = require('marked');
const markdown = '<img src="x" oner ror="alert(\'XSS\')"> Hello';
const html = marked(markdown, { sanitize: true });
console.log(html);
// Вывод: "Hello"
В этом примере встроенный HTML-тег <img> с
атрибутом onerror был полностью удалён.
Важно: В новых версиях Marked параметр
sanitize считается устаревшим. Вместо него рекомендуется
использовать renderer и внешние библиотеки для очистки
HTML, такие как DOMPurify.
Marked позволяет настраивать renderer, чтобы контролировать генерацию HTML на уровне каждого элемента. Это дает гибкость для безопасного рендеринга, например, фильтрации ссылок или изображений:
const renderer = new marked.Renderer();
renderer.link = function(href, title, text) {
const safeHref = href.startsWith('http') ? href : '#';
return `<a href="${safeHref}" title="${title || ''}">${text}</a>`;
};
const html = marked('[Click me](jav * ascript:alert(1))', { renderer });
console.log(html);
// Вывод: <a href="#">Click me</a>
Здесь все ссылки с небезопасными схемами (jav * ascript:)
заменяются на безопасные.
Так как параметр sanitize устарел, безопаснее всего
использовать проверенные библиотеки, например:
Пример с DOMPurify:
const DOMPurify = require('dompurify')(window);
const dirtyHtml = marked('<script>alert(1)</script>Safe text');
const cleanHtml = DOMPurify.sanitize(dirtyHtml);
console.log(cleanHtml);
// Вывод: "Safe text"
Для защиты приложения важно соблюдать следующие правила:
sanitize.)
Без очистки приведет к выполнению скрипта в браузере.
[Click me](jav * ascript:alert('XSS'))
Непроверенные ссылки могут открывать возможности для атаки.
<div oncl ick="alert('XSS')">Click</div>
Любой HTML должен фильтроваться перед рендерингом.
const renderer = new marked.Renderer();
renderer.image = (href, title, text) => {
const safeHref = href.startsWith('https://') ? href : '';
return `<img src="${safeHref}" alt="${text}" title="${title || ''}">`;
};
renderer.link = (href, title, text) => {
const safeHref = href.startsWith('http') ? href : '#';
return `<a href="${safeHref}" title="${title || ''}">${text}</a>`;
};
const dirtyMarkdown = '[Malicious](jav * ascript:alert(1)) )';
const safeHtml = DOMPurify.sanitize(marked(dirtyMarkdown, { renderer }));
console.log(safeHtml);
// Вывод: безопасный HTML без выполнения скриптов
sanitize в Marked устарел и не должен
использоваться в новых проектах.Безопасная обработка Markdown — не опция, а обязательное требование для любого проекта, работающего с пользовательским контентом.