HTML и безопасность

Markdown допускает сырой HTML в исходнике, и LibreTimes сохраняет его контролируемое подмножество. Всё, что рендерит документ – и порождённое Markdown, и написанное руками, – проходит санитизацию по принципу списка разрешённого: что не разрешено явно, то удаляется.

Сырой HTML, которым можно пользоваться

Синтаксис Markdown покрывает почти всё, так что сырой HTML нужен редко. Полезные разрешённые случаи:

ЭлементЗачем писать
<details> / <summary>сворачиваемая секция; тот же результат, что у директивы spoiler
<sub> / <sup>индексы, эквивалент ~x~ / ^x^
<mark>выделение, эквивалент ==x==
<kbd>клавиши: Ctrl+K
<table>, <thead>, <tbody>, <tr>, <th>, <td>таблицы, которым нужны rowspan/colspan сверх синтаксиса GFM
<img width="..." height="...">изображение с явными размерами
<br>, <hr>, <blockquote>, <dl>/<dt>/<dd>стандартная структура, эквивалент Markdown-форм

Стандартные строчные и блочные элементы (<b>, <i>, <em>, <strong>, <code>, <pre>, <p>, <ul>, <ol>, <li>, заголовки и подобное) тоже разрешены – ради читаемости предпочитайте Markdown-формы.

Что удаляет санитизация

  • Скрипты и обработчики: <script>, <style> и все атрибуты событий on*. Выполнить код из документа нельзя.
  • Опасные URL: href вне https/http/mailto и src изображений вне https/http (никаких javascript:, никаких data:).
  • Фреймы: <iframe> выживает только в виде, который порождают видеовставки, с src, ограниченным youtube-nocookie.com и player.vimeo.com. Любой другой фрейм удаляется целиком.
  • Произвольные стили: атрибуты style, с точечным исключением для размеров видеоплеера. Документ не может перекрасить страницу вокруг себя.
  • Всё неперечисленное: <form>, <input>, <object>, <embed>, <canvas>, кастомные элементы – удаляются, как и неперечисленные атрибуты на разрешённых элементах.

Удаление происходит молча: запрещённый узел исчезает со страницы, а не порождает ошибку.

Замечания авторам

  • id, написанные в сыром HTML, в выводе получают префикс user-content- (стандартная защита от подмены DOM). Якоря заголовков генерируются сами, так что свои id нужны редко.
  • Если что-то из написанного не появилось на странице, вероятнее всего это срезала санитизация. Сверьтесь со списками на этой странице; Markdown-форма той же конструкции – обычно и есть ответ.
  • Санитизация не заменяет суждения о содержании – она останавливает код, а не утверждения. Нормы сообщества – политика допустимого использования.