Насколько безопасно принимать предопределенный набор неопасных тегов HTML из запроса? - PullRequest
6 голосов
/ 18 сентября 2010

Одной из первых вещей, которые я узнал как веб-разработчик, было то, что я никогда не принимал 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.

Ответы [ 3 ]

5 голосов
/ 18 сентября 2010

Неясно, какой язык программирования вы используете или предпочитаете, но в Java есть Jsoup , который представляет собой довольно приятный API синтаксического анализатора HTML, который содержит среди прочего HTML-очиститель, основанный на настраиваемом белом списке HTML теги и атрибуты (к сожалению, нет правил CSS, поскольку это полностью выходит за рамки HTML-анализатора). Вот выдержка из его сайта .

Очистка ненадежного HTML

Задача

Вы хотите разрешить ненадежным пользователям предоставлять HTML для вывода на ваш веб-сайт (например, в виде комментариев). Вам необходимо очистить этот HTML-код, чтобы избежать атак межсайтовый скриптинг (XSS).

Решение

Используйте jsoup HTML Cleaner с конфигурацией, указанной в Whitelist.

String unsafe = 
      "<p><a href='http://example.com/' onclick='stealCookies()'>Link</a></p>";
String safe = Jsoup.clean(unsafe, Whitelist.basic());
      // now: <p><a href="http://example.com/" rel="nofollow">Link</a></p>

Сам класс Whitelist содержит несколько предопределенных белых списков, которые могут быть полезны, например Whitelist#basic() и Whitelist#relaxed().

Для .NET, кстати, есть порт Jsoup с именем NSoup

2 голосов
/ 18 сентября 2010

Для PHP, посмотрите HTML Purifier , он отфильтровывается с очень расширенными настраиваемыми настройками (такими как разрешенные / запрещенные теги, атрибуты, стили и т. Д.), Включая XSS и хитрый стиль (например, display: none) защита.

Кроме того, TinyMCE выполняет небольшую фильтрацию, но, поскольку она на стороне клиента, вам все равно не следует ей доверять.

1 голос
/ 18 сентября 2010

Из тегов, которые вы планируете разрешить, <a> определенно требует дополнительного внимания из-за возможности javascript: URL.И, конечно же, вам нужно запретить обработчики событий JavaScript из всех тегов.

...