Подтвердить что ты не робот

"Безопасный" процессор уценки для PHP?

Есть ли реализация PHP для уценки, подходящая для использования в публичных комментариях?

В принципе, он должен допускать только подмножество синтаксиса уценки (жирный, курсив, ссылки, кавычки, кодовые блоки и списки) и вырезать весь встроенный HTML (или, возможно, избежать его?)

Я предполагаю, что один из вариантов - использовать обычный анализатор разметки и запускать вывод через HTML-санитор, но есть ли лучший способ сделать это.?

Мы используем PHP markdown Extra для остальной части сайта, поэтому нам уже придется использовать вторичный парсер (вариант "Extra", поскольку такие вещи, как поддержка сносок, не нужны). Это также кажется лучше разбираться только в тексте *bold* и иметь все, что ушло в &lt;a href="etc"&gt;, чем генерировать текст <b>bold</b> и пытаться разбить биты, которые нам не нужны.

Кроме того, в соответствующей заметке мы используем элемент управления ОМУ для "основного" сайта, но для комментариев, какие существуют другие варианты? Предварительный просмотр javascript WMD хорош, но для него потребуется такая же "стерилизация", как процессор уценки PHP (он не может отображать изображения и т.д., Иначе кто-то подаст, и их рабочая уценка "сломается" )

В настоящее время я планирую использовать метод santiser PHP-markdown → HTML и редактировать WMD для удаления синтаксиса изображения/заголовка из showdown.js - но похоже, что это было сделано бесчисленное количество раз до этого.

В принципе:

  • Есть ли "безопасная" реализация уценки в PHP?
  • Есть ли редактор уценки HTML/javascript, который может иметь одинаковые параметры, которые легко отключить?

Обновление: Я закончил просто запуск вывода markdown() через HTML очиститель.

Таким образом, рендеринг Markdown был отделен от выпускаемой санитарии, что намного проще (две в основном немодифицированные кодовые базы) более безопасны (вы не пытаетесь сделать одновременно рендеринг и санитацию) и более гибкими (вы можете имеют несколько уровней санитарии, говорят более слабую конфигурацию для доверенного контента и гораздо более строгую версию для публичных комментариев)

4b9b3361

Ответ 1

У PHP Markdown есть опция sanitizer, но, похоже, она не рекламируется нигде. Взгляните на вершину класса Markdown_Parser в markdown.php (начинается в строке 191 в версии 1.0.1m). Нам интересны строки 209-211:

# Change to `true` to disallow markup or entities.
var $no_markup = false;
var $no_entities = false;

Если вы измените их на true, разметка и сущности соответственно должны быть экранированы, а не вставлены дословно. Кажется, что нет встроенного способа их изменения (например, через конструктор), но вы всегда можете добавить его:

function do_markdown($text, $safe=false) {
    $parser = new Markdown_Parser;
    if ($safe) {
        $parser->no_markup = true;
        $parser->no_entities = true;
    }
    return $parser->transform($text);
}

Обратите внимание, что вышеприведенная функция создает новый синтаксический анализатор для каждого запуска, а не кэширует его, как это делает предоставленная функция Markdown (строки 43-56), поэтому она может быть немного медленной.

Ответ 2

JavaScript Markdown Editor Гипотеза:

  • Используйте редактор Markdown, управляемый JavaScript, например, на основе вскрытия
  • Удалите все значки и визуальные подсказки с панели инструментов для нежелательных элементов.
  • Настройте фильтр JavaScript для очистки нежелательной разметки при отправке
  • Проверить и упростить все изменения и фильтры JavaScript на локальном компьютере.
  • Отразить эти фильтры в представлении PHP script, чтобы поймать их на стороне сервера.
  • Удалите все ссылки на нежелательные элементы из справки/учебников

Я создал редактор Markdown в JavaScript, но у него есть расширенные функции. Это заняло большой кусок времени и пересмотры SVN. Но я не думаю, что было бы трудно изменить редактор Markdown, чтобы ограничить допустимый HTML.

Ответ 3

Если вы хотите написать свой собственный парсер, почему бы не использовать архитектуру BBCode.

При отправке ваших комментариев (пользователей) вам необходимо дезинформировать текст с помощью mysql_escape_real_string(), да, есть другие функции, но это остановит любые инъекции JS.

Ответ 4

Как насчет запуска htmlspecialchars на введенном пользователем входе, прежде чем обрабатывать его с помощью уценки? Он должен избегать чего-нибудь опасного, но оставить все, что понимает уценка.

Я пытаюсь придумать случай, когда это не сработает, но ничего не может придумать.