«Безопасный» процессор уценки для PHP? - PullRequest
36 голосов
/ 20 мая 2009

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

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

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

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

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

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

В основном:

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

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

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

Ответы [ 4 ]

27 голосов
/ 01 июля 2009

В PHP Markdown есть опция дезинфекции, но она нигде не рекламируется. Взгляните на верхнюю часть класса 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 голосов
/ 20 мая 2009

Гипотеза редактора уценки JavaScript:

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

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

0 голосов
/ 14 января 2010

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

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

0 голосов
/ 20 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...