HTML Sanitizer для.NET, поддерживающий теги стиля

Я ищу хорошее дезинфицирующее средство HTML для использования в проекте ASP.NET. Подвох в том, что дезинфицирующее средство должно поддерживать атрибуты стиля, которые могут содержать свойства CSS, которые также должны быть очищены. До сих пор я не смог найти хороший продукт для использования. Прежде чем я укусил пулю и написал свое собственное дезинфицирующее средство, я подумал, что я мог бы попытаться выяснить, что люди здесь используют в первую очередь.

Библиотеки, на которые я смотрел и которые отвергали:

  • AntiXSS Library (old version is insecure, new version strips style tags)
  • AntiSamy.NET (unmaintained, lacks necessary features in the.NET version, has obsolete dependencies)
  • The HTMLAgilityPackSanitizer in AjaxControlToolkit (escapes style tags)

The ideal would be to have a whitelist-based sanitizer that also validates property values against a list of known values or regexes.

Anybody able to point me in the right direction?

5 ответов

Попробуйте этот собственный.NET HTML Sanitizer проект. Он может понимать атрибуты стиля так, как вы хотите (хотя он не пытается сохранить теги STYLE, он просто удаляет их).

Кроме того, он основан на белом списке, а не на черном списке (и вместо CsQuery используется AngleSharp, который сейчас не рекомендуется). Это также на Nuget!

Посмотрите на CsQuery (основным автором которого я являюсь) как инструмент для манипулирования HTML.

Это порт.NET jQuery, он предоставляет вам полный доступ к HTML с помощью тех же методов, которые вы использовали бы на клиенте (DOM и API jQuery). Это позволяет довольно легко свернуть ваше собственное дезинфицирующее средство.

Рик Страл недавно написал в блоге сообщение о дезинфекции HTML. Он показал, как это сделать с помощью своих правил с помощью HTML Agility Pack. Я разместил там комментарий, показывающий, как с помощью CsQuery легче добиться того же. Основы только это, учитывая перечисление тегов BlackList:

CQ doc = CQ.Create(html);

// creates a grouped selector "iframe,form,script, ..."
string selector = String.Join(",",BlackList); 

// CsQuery uses the property indexer as a default method, it's identical 
// to the "Select" method and functions like $(...)

doc[selector].Remove();

Если вы не хотите фактически удалять контент в некоторых тегах, например, возможно, форматировать теги, которые вы хотите запретить, вы можете вместо этого использовать распаковку jQuery. Это приведет к удалению тега, но сохранению его дочерних элементов.

doc[selector].UnWrap();

Когда вы закончите:

string cleanHtml = doc.Render();

В статье Рика есть еще кое-что для очистки атрибутов событий javascript и т. Д., Но в основном CsQuery - это набор инструментов с привычным и простым способом манипулирования HTML. Должно быть достаточно легко создать дезинфицирующее средство, которое работает так, как вы хотите.

Модель DOM в CsQuery также содержит методы для прямого доступа к стилям (например, более удобным способом, чем просто манипулирование строкой), если вам нужно что-то вроде удаления определенных именованных стилей. Например, вы можете удалить стиль "font-weight" из всех элементов:

// use the [attribute] selector to target only elements with styles

foreach (IDomObject element in doc["[style]"]) {
    if (element.HasStyle("font-weight")) {
        element.RemoveStyle("font-weight");
    }
}

Основным недостатком CsQuery сейчас является документация. Его API разработан так, чтобы максимально приблизить браузер DOM и jQuery (учитывая языковые различия между jQuery и C#), а общедоступный API хорошо прокомментирован, поэтому его будет достаточно просто кодировать, когда вы начнете работать.

Но есть несколько нестандартных методов (таких как "HasStyle" и "RemoveStyle", которые являются уникальными для CsQuery). Базовое использование довольно хорошо описано в файле readme на github. Это также на Nuget, как CsQuery,

Проверьте Dead Simple HTML Sanitizer на CodeProject http://www.codeproject.com/Tips/529712/Dead-Simple-HTML-Sanitizer

Tatham Oddie ASP.Net MVP - http://blog.tatham.oddie.com.au/2009/06/15/released-xhtml-markup-sanitizer/

Я передал это нескольким людям сейчас. Возможно, не все, что вы хотите, но Tatham отличный программист, поэтому он должен дать вам множество идей...

Просто на AntiXSS, AFAIK новая версия находится в HTMLAgilityPackSanitizer

Попробуйте посмотреть на HtmlSanitizer, опубликованный в блоге открытой лаборатории: http://roberto.open-lab.com/2010/03/04/a-html-sanitizer-for-c/. Этот поддерживает тэги стиля и довольно хорош для использования в редакторах HTML.

Другие вопросы по тегам