HTMLPurifier игнорирует образцы/теги кода WMD/WYSIWYG, как это делает SO

Я тестирую редактор WMD, подобный тому, который используется здесь, на SO, чтобы разрешить разметку при вводе пользователем. Я применяю HTMLPurifier к входным данным, и он очищает все плохие теги. Однако, как и SO, я также хочу разрешить образцы кода
like this (backticks)

like this (indentation)
and even like this (with pre and code tags)

однако, если пользователь помещает в образец какой-то неприятный код, например:

<script>alert("annoy");</script>

HTMLPurifier удаляет его.
Как я могу разрешить любой ввод данных пользователем для примеров кода с помощью HTMLPurifier?


Я видел этот другой вопрос, но ответ просто


person M.M    schedule 19.08.2016    source источник
comment
Можете ли вы сказать нам, с какой частью ответа на другой вопрос вы боретесь? Вам нужна помощь с регулярным выражением или синтаксисом preg_replace_callback()? Вы не знакомы с CDATA? Вы не уверены, где вам следует преобразовывать блоки кода в блоки CDATA в потоке кода? Кроме того, как выглядит код, который уничтожает HTML Purifier? Поскольку вы работаете с WYSIWYG, вы можете столкнуться с этой проблемой: stackoverflow.com/a/34962904/245790   -  person pinkgothic    schedule 20.08.2016
comment
Спасибо за ответ @pinkgothic, до сих пор я использовал preg_replace_callback для экранирования литералов, и это работает, но это выглядит как небезопасный способ сделать это, интересно, есть ли у htmlpurifier какая-либо конфигурация, которая позволяет что-либо (например, вредоносный код) внутри тегов (которые также могут быть обратными кавычками или просто отступом). И да, я не знаком с CDATA.   -  person M.M    schedule 20.08.2016
comment
Подход, предложенный Эдвардом, работает следующим образом: непосредственно перед очисткой возьмите HTML-код, который вы хотите очистить, используйте для него регулярные выражения, чтобы найти блоки <code>...</code>, и замените их блоками <code><![CDATA[...]]></code> (вещи, обозначенные ..., вообще не меняются). . Затем приступайте к очистке.   -  person pinkgothic    schedule 21.08.2016
comment
Можете ли вы показать нам код HTML, который искажается? Как я уже сказал в своем первом комментарии, проблема может заключаться в том, как вы используете свой WYSIWYG. Самая распространенная ошибка заключается в том, что не используется htmlspecialchars() в HTML, прежде чем помещать его в WYSIWYG <textarea>. Если вы не экранируете HTML перед тем, как поместить его в <textarea>, измените свой код так, чтобы он экранировал его. Это не только необходимо, но и может решить проблему с кодовыми блоками! Смотрите ответ, который я связал в моем первом комментарии для объяснения.   -  person pinkgothic    schedule 21.08.2016
comment
@pinkgothic Является ли CDATA поведением HTMLPurifier по умолчанию? Что касается вашего последнего комментария, я уже использую htmlspecialchars()   -  person M.M    schedule 21.08.2016
comment
CDATA — это просто другая форма экранирования в HTML (и HTML Purifier оставляет экранированный текст в одиночку в HTML, так как это никогда не бывает опасно). См. stackoverflow.com/questions/2784183/what -значит ли-cdata-in-xml   -  person pinkgothic    schedule 21.08.2016
comment
@pinkgothic я настрою свой код для использования CDATA и протестирую его, если вы хотите формализовать свой комментарий, вы можете опубликовать вопрос, и я его одобрю, ура   -  person M.M    schedule 22.08.2016