Чистый пользовательский HTML в .net - PullRequest
5 голосов
/ 06 января 2010

Мой сайт C # позволяет пользователям отправлять HTML для отображения на сайте. Я хотел бы ограничить теги и атрибуты, разрешенные для HTML, но не могу понять, как это сделать в .net.

Я пытался использовать Html Agility Pack , но я не вижу, как изменить HTML, я вижу, как пройти через HTML и найти определенные данные, но фактически генерирует выходной файл сбивает с толку меня

У кого-нибудь есть хороший пример очистки HTML в .net? Ответом может быть пакет гибкости, но документация отсутствует.

Ответы [ 6 ]

4 голосов
/ 06 января 2010

Я бы настоятельно рекомендовал Microsoft Anti-XSS Library для очистки ввода.Поддерживает санитарную обработку HTML.

3 голосов
/ 06 января 2010

Вы должны принимать только правильно сформированный HTML.

Затем вы можете использовать LINQ to XML для анализа и изменения.

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

Например:

//Maps allowed tags to allowed attributes for the tags.
static readonly Dictionary<string, string[]> AllowedTags = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase) {
    { "b",    new string[0] },
    { "img",  new string[] { "src", "alt" } },
    //...
};
static XElement CleanElement(XElement dirtyElement) {
    return new XElement(dirtyElem.Name,
        dirtyElement.Elements
            .Where(e => AllowedTags.ContainsKey(e.Name))
            .Select<XElement, XElement>(CleanElement)
            .Concat(
                dirtyElement.Attributes
                    .Where(a => AllowedTags[dirtyElem.Name].Contains(a.Name, StringComparer.OrdinalIgnoreCase))
            );
}

Если вы разрешаете гиперссылки, обязательно запретите javascript: urls; этот код этого не делает.

2 голосов
/ 06 января 2010

С помощью HtmlAgilityPack вы можете удалить ненужные теги из ввода:

node.ParentNode.RemoveChild(node);
0 голосов
/ 04 января 2011

Джефф Этвуд опубликовал свой подход на основе белого списка в Refactor My Code на http://refactormycode.com/codes/333-sanitize-html

Я полагаю, что StackOverflow сочетает это с кодом балансировки тегов на http://refactormycode.com/codes/360-balance-html-tags для очистки сообщений и подготовки их к отображению. И, конечно же, они используют MarkdownSharp для включения Markdown для сообщений.

0 голосов
/ 06 января 2010

Вы видели MarkdownSharp , который является открытым исходным кодом и создан парнями здесь?

0 голосов
/ 06 января 2010

Инструмент, который можно использовать вне SourceForge: SGMLReader , который превращает HTML в правильно отформатированный XML и позволяет вам читать его как XmlReader или загружать в объект XmlDocument для дальнейшей обработки. Я использовал это раньше для разбора веб-страниц, которые не всегда имеют правильно отформатированный HTML.

...