GetSafeHtmlFragment удаляет все теги html

Я использую GetSafeHtmlFragment на своем веб-сайте и обнаружил, что все теги, кроме <p> а также <a> устранен.

Я искал вокруг и обнаружил, что нет разрешения от Microsoft.

Есть ли что-то замененное или есть какое-то решение?

Благодарю.

2 ответа

Решение

Альтернативным решением было бы использовать Html Agility Pack в сочетании с вашим собственным белым списком тегов:

using System;
using System.IO;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using HtmlAgilityPack;

class Program
{
    static void Main(string[] args)
    {
        var whiteList = new[] 
            { 
                "#comment", "html", "head", 
                "title", "body", "img", "p",
                "a"
            };
        var html = File.ReadAllText("input.html");
        var doc = new HtmlDocument();
        doc.LoadHtml(html);
        var nodesToRemove = new List<HtmlAgilityPack.HtmlNode>();
        var e = doc
            .CreateNavigator()
            .SelectDescendants(System.Xml.XPath.XPathNodeType.All, false)
            .GetEnumerator();
        while (e.MoveNext())
        {
            var node =
                ((HtmlAgilityPack.HtmlNodeNavigator)e.Current)
                .CurrentNode;
            if (!whiteList.Contains(node.Name))
            {
                nodesToRemove.Add(node);
            }
        }
        nodesToRemove.ForEach(node => node.Remove());
        var sb = new StringBuilder();
        using (var w = new StringWriter(sb))
        {
            doc.Save(w);
        }
        Console.WriteLine(sb.ToString());
    }
}

Удивительно, что Microsoft в версии 4.2.1 ужасно компенсировала утечку безопасности в библиотеке 4.2 XSS и теперь все еще не обновлялась год спустя. GetSafeHtmlFragment метод должен был быть переименован в StripHtml когда я читаю, кто-то комментирует где-то.

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

Эта библиотека в основном реализует вариант подхода "белого списка", используемый в настоящее время принятым ответом. Однако это основано на CsQuery вместо библиотеки HTML Agility. Пакет также предоставляет некоторые дополнительные параметры, такие как возможность сохранять информацию о стиле (например, атрибуты HTML). Использование этой библиотеки привело к созданию кода в моем проекте, как показано ниже, что, по крайней мере, намного меньше кода, чем принятый ответ:).

using Html;

...

var sanitizer = new HtmlSanitizer();
sanitizer.AllowedTags = new List<string> { "p", "ul", "li", "ol", "br" };
string sanitizedHtml  = sanitizer.Sanitize(htmlString);
Другие вопросы по тегам