Библиотека Marked — это мощный парсер Markdown для JavaScript, который позволяет преобразовывать текст в формате Markdown в HTML. Одной из ключевых задач при использовании Marked является обеспечение безопасности, особенно когда исходный Markdown поступает от ненадёжных источников. Важно предотвратить внедрение вредоносного кода и XSS-атак, сохранив при этом возможность корректного отображения контента.
sanitizeОпция sanitize позволяет автоматически удалять
потенциально опасные HTML-теги из Markdown-контента. Пример
использования:
const marked = require('marked');
const markdownString = '<script>alert("XSS")</script> **Hello World**';
const html = marked(markdownString, { sanitize: true });
console.log(html); // <p>**Hello World**</p>
Особенности:
<script> и другие опасные
элементы.DOMPurify.mangle и headerIdsMarked поддерживает опции, влияющие на генерацию HTML:
marked.use({
mangle: false,
headerIds: false
});
По умолчанию Marked позволяет включать HTML внутри Markdown. Для безопасного использования следует контролировать, какие теги разрешены. Пример интеграции с DOMPurify:
const DOMPurify = require('dompurify');
const { JSDOM } = require('jsdom');
const window = new JSDOM('').window;
const purify = DOMPurify(window);
const unsafeMarkdown = '<img src=x oner ror=alert(1)> **Text**';
const rawHtml = marked.parse(unsafeMarkdown);
const safeHtml = purify.sanitize(rawHtml);
console.log(safeHtml); // <p><strong>Text</strong></p>
Преимущества такого подхода:
onerror,
onclick и других).Marked предоставляет возможность создавать кастомные рендереры, чтобы контролировать генерацию HTML для каждой сущности Markdown:
const renderer = {
link(href, title, text) {
// Добавление атрибутов rel и target для безопасности
return `<a href="${href}" title="${title || ''}" target="_blank" rel="noopener noreferrer">${text}</a>`;
},
image(href, title, text) {
return `<img src="${href}" alt="${text}" title="${title || ''}" loading="lazy"/>`;
}
};
marked.use({ renderer });
Особенности:
Для безопасного рендеринга Markdown в веб-приложении рекомендуется интегрировать CSP:
Такой подход гарантирует, что даже при ошибках в фильтрации HTML не будет выполнен вредоносный код.
sanitize для современных
проектов.Такой процесс обеспечивает баланс между функциональностью и безопасностью, предотвращает XSS и сохраняет корректное отображение Markdown-контента.