Разрешить пользователям публиковать BBCode или HTML с помощью WYSIWYG?

Я обновляю систему страниц участников, и одно из требований - разрешить полужирный шрифт, подчеркивание, курсив, цвет шрифта и ссылки в определенных полях, но не размер или стиль шрифта - все это с помощью редактора WYSIWYG. . Первоначально это было сделано с помощью текстового поля и некоторой минимальной фильтрации HTML, то есть удаления <script> с помощью preg_replace(). Я знаю, что это безумно и определенно небезопасно.

Моя первая версия заключалась в том, чтобы использовать TinyMCE и запретить определенные теги в TinyMCE, единственная проблема заключается в том, что, очевидно, я не могу полагаться на TinyMCE как на какой-либо валидатор, а защита ввода HTML от XSS, которую я обнаружил, является абсолютным минным полем. Я потратил последний час или около того на изучение определенных практик, и кажется почти невозможным разрешить определенные HTML-теги / атрибуты, не испортив текущие профили и, кроме того, позволяя другие настройки, такие как размер шрифта и вещи со встроенными стилями. Например, мне нужно разрешить цвета шрифта с тегами span, но разрешение атрибута style также позволит использовать любой фрагмент CSS.

Теперь мне пришла в голову идея использовать BBCode с редактором WYSIWYG, так как это позволит нам безопасно применять htmlspecialchars() к выходным данным, а затем полностью контролировать любой HTML, созданный с помощью синтаксического анализатора BBCode для [b], [u] , [i] и [color] теги с nl2br() для разрывов строк.

Единственная проблема в том, что мне придется что-то кодировать, чтобы преобразовать текущую настройку HTML в BBCode.

Мой главный вопрос: хватит ли вышеупомянутых шагов с BBCode для защиты от XSS-атак? Или есть более изящный / очевидный метод защиты HTML, который я могу использовать?


person Dunhamzzz    schedule 06.01.2011    source источник


Ответы (2)


Вы можете использовать библиотеку HTML Purifier. Это тяжеловесно, но допускает такие правила, как «разрешать только настройку цвета в тегах стиля». Он тщательно протестирован и активно развивается.

person chiborg    schedule 06.01.2011
comment
Это имеет отношение к моим интересам, есть ли где-нибудь пример того, как это сделать? - person Dunhamzzz; 06.01.2011

Сохраните в формате html и используйте соответствующий анализатор HTML (например, DOMDocument), чтобы избавиться от опасные теги (например, htmlspecialchars опасные теги вместо этого применяются вслепую ко всем узлам содержимого)

person ajreal    schedule 06.01.2011
comment
Это то, что я сделал вначале, но одно требование состоит в том, чтобы пользователи могли изменять цвет шрифта, но не имели возможности помещать что-либо в атрибут стиля. Я только что уточнил это в вопросе :) - person Dunhamzzz; 06.01.2011