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

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

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

  • Библиотека AntiXSS (старая версия - это небезопасные, теги стиля стилей новой версии)
  • AntiSamy.NET(не поддерживается, не хватает необходимых функций в версии .NET, имеет устаревшие зависимости)
  • HTMLAgilityPackSanitizer в AjaxControlToolkit (ускользает от тегов стиля)

Идеальным было бы иметь дезинфицирующее средство на основе белого списка, которое также проверяет значения свойств на список известных значений или регулярных выражений.

Кто-нибудь может указать мне в правильном направлении?

Ответ 1

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

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

Ответ 2

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

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

Рик Стралл недавно опубликовал сообщение в блоге о санитарной обработке 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 identical 
// to the "Select" method and functions like $(...)

doc[selector].Remove();

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

doc[selector].UnWrap();

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

string cleanHtml = doc.Render();

Там больше на странице Ricks для очистки атрибутов событий 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 и С#), а публичный API хорошо комментируется, поэтому его нужно легко скопировать, как только вы начнете.

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

Ответ 3

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

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

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

Ответ 4

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