Уберите пользователя HTML в .NET

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

Я попытался использовать Пакет Гибкости HTML, но я не вижу, как изменить HTML, я вижу, как пройти HTML и найти определенные данные, но на самом деле генерация выходного файла экранирует меня.

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

5
задан spaetzel 6 January 2010 в 15:48
поделиться

5 ответов

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

node.ParentNode.RemoveChild(node);
2
ответ дан 14 December 2019 в 01:09
поделиться

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

.
0
ответ дан 14 December 2019 в 01:09
поделиться

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

0
ответ дан 14 December 2019 в 01:09
поделиться

Я бы настоятельно рекомендовал библиотеку Anti-XSS от Microsoft для дезинфекции входных данных. Она поддерживает дезинфекцию html.

.
4
ответ дан 14 December 2019 в 01:09
поделиться

Вы должны принимать только хорошо сформированный 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))
            );
}

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

.
3
ответ дан 14 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: