Насколько безопасно принимать предопределенный набор неопасных тегов HTML из запроса?
Одна из первых вещей, которую я узнал как веб-разработчик, - никогда не принимать 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
Они охватывают все, что мне нужно для форматирования, и (насколько я знаю) не представляют никакой угрозы безопасности. По сути, обеспечение правильной формы и отсутствие каких-либо стилей верстки не позволяют никому повредить макету сайта. Запрещение тега script и тому подобное предотвращают XSS.
(Одно исключение: может быть, мне следует разрешитьwidth
/height
в предопределенном диапазоне для изображений.)
Другое преимущество: этот материал избавил бы меня от необходимости писать / искать конвертер BBCode-Html.
Как вы думаете?
Это безопасная вещь?
(Как я вижу, StackOverflow также допускает некоторый базовый HTML-код в поле «О себе», поэтому я думаю, что я не первый, кто реализует это.)
РЕДАКТИРОВАТЬ:
я нашелэтот ответ который объясняет, как сделать это довольно легко.
И, конечно же,никто не должен думать об использовании регулярных выражений для этого.
Сам вопрос не связан с каким-либо языком или технологией, но если вам интересно, я пишу это приложение в ASP.NET.