Одной из первых вещей, которые я узнал как веб-разработчик, было то, что я никогда не принимал HTML от клиента.(Возможно, только если я закодирую HTML.)
Я использую редактор WYSIWYG (TinyMCE), который выводит HTML.До сих пор я использовал его только на странице администратора, но теперь я хотел бы также использовать его на форуме.У него есть модуль BBCode, но он кажется неполным.(Возможно, что сам BBCode не поддерживает все, что я хочу.)
Итак, вот моя идея:
Я разрешаю клиенту напрямую ПОСТАВИТЬ некоторый HTML-код.Затем я проверяю код на здравомыслие ( хорошо сформированный ) и удаляю все теги, атрибуты и правила CSS, которые не разрешены, на основе предварительно определенного набора разрешенных тегов и стилей.
Очевидно,Я бы позволил материал, который может быть выведен подмножеством функций TinyMCE, которые я использую.
Я бы позволил следующие теги:
span
, sub
, sup
, a
,p
, ul
, ol
, li
, img
, strong
, em
, br
Со следующими атрибутами:
style
(длявсе), href
и title
(для a
), alt
и src
(для img
)
и следующие правила CSS:
color
, font
, font-size
, font-weight
, font-style
, text-decoration
Они охватывают все, что мне нужно для форматирования, и (насколько я знаю) не представляют никакой угрозы безопасности.По сути, обеспечение правильной формы и отсутствие каких-либо стилей верстки не позволяют никому повредить макету сайта.Запрещение тега сценария и подобные ему препятствуют XSS.
(Одно исключение: возможно, мне следует разрешить width
/ height
в предопределенном диапазоне для изображений.)
Другое преимущество: этот материал избавил бы меня от необходимости писать / искать конвертер BBCode-Html.
Как вы думаете?
Это безопасное занятие?
(Как я вижу, StackOverflow также допускает некоторый базовый HTML в поле «О себе», поэтому я думаю, что я не первый, кто реализует это.)
РЕДАКТИРОВАТЬ:
Я нашел этот ответ , который объясняет, как сделать это довольно легко.
И, конечно, никто не должен думать об использовании регулярных выражений для этого .
Сам вопрос не относится ни к какому языку или технологии, но если вам интересно, я пишу это приложение в ASP.NET.