Использование другой разметки (например, Markdown) для хранения html, введенной пользователем, является банкой червей. Большая сложность и не решит автоматически ваши проблемы (в основном это XSS). Вы можете просто сохранить дезинфицированный использованный ввод (или даже исходный несанкционированный пользовательский ввод, если хотите, см. Ниже).
Дело в том, что в какой-то момент перед добавлением пользовательского ввода на страницу DOM вам необходимо удалить Javascript. Поскольку в этих редакторах есть функция предварительного просмотра, которая вообще не отправляет данные на сервер, обычно лучше всего удалить javascript на стороне клиента, в javascript, с помощью хуков, которые предоставляет ваш редактор. В случае CKEditor одним из таких хуков является событие contentPreview
(хотя я не очень хорошо знаком с CKEditor).
Итак, у вас должна быть библиотека javascript, которая занимает кучу html code (вывод вашего редактора) и возвращает тот же html, но с удаленным Javascript. У Google Caja есть такой клиентский компонент html sanitizer, а также есть другие подобные библиотеки. Это должно быть выполнено во время (до) предварительного просмотра, поэтому все javascript удаляются перед фактическим просмотром содержимого. То же самое следует сделать перед отображением содержимого, полученного с сервера (независимо от того, хранятся ли очищенные или необработанные данные).
Хотите ли вы выполнить эту очистку перед отправкой данных на сервер, зависит от вашего варианта использования. В этом нет строгой необходимости, но тогда вы должны быть осторожны при использовании этих данных в других потенциальных приложениях (например, например, другое приложение «администратора» или «управление» может отображать их небезопасным образом - это не должно быть случай, так как это будет XSS в другом приложении).
Также обратите внимание, что даже после удаления всех javascript, html, введенный пользователем, может по-прежнему представлять другие потенциальные уязвимости. Например, возможность встроить изображение с источником, указывающим на другой сайт, может позволить злоумышленнику отслеживать использование страницы приложения. Возможность ссылаться на внешние сайты может позволить злоумышленнику выполнять фишинговые атаки и т. Д. Это зависит от вашего конкретного сценария использования и модели угроз, и ничего из этого не может быть предотвращено только санацией.