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);