Ich habe mir die hier vorgeschlagenen Regex-basierten Lösungen angesehen und sie erfüllen mich nur in den trivialsten Fällen mit Vertrauen. Eine spitze Klammer in einem Attribut ist alles, was Sie brauchen, um zu brechen, geschweige denn falsch formuliertes HTML aus der Wildnis. Und was ist mit Entitäten wie &
? Wenn Sie HTML in einfachen Text konvertieren möchten, müssen Sie auch Entitäten dekodieren.
Also schlage ich die folgende Methode vor.
Mit HtmlAgilityPack entfernt diese Erweiterungsmethode effizient alle HTML-Tags aus einem HTML-Fragment. Dekodiert auch HTML-Entitäten wie &
. Gibt nur die inneren Textelemente mit einer neuen Zeile zwischen den einzelnen Textelementen zurück.
public static string RemoveHtmlTags(this string html)
{
if (String.IsNullOrEmpty(html))
return html;
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
{
return WebUtility.HtmlDecode(html);
}
var sb = new StringBuilder();
var i = 0;
foreach (var node in doc.DocumentNode.ChildNodes)
{
var text = node.InnerText.SafeTrim();
if (!String.IsNullOrEmpty(text))
{
sb.Append(text);
if (i < doc.DocumentNode.ChildNodes.Count - 1)
{
sb.Append(Environment.NewLine);
}
}
i++;
}
var result = sb.ToString();
return WebUtility.HtmlDecode(result);
}
public static string SafeTrim(this string str)
{
if (str == null)
return null;
return str.Trim();
}
Wenn Sie wirklich ernst sind, würden Sie den Inhalt bestimmter HTML - Tags ignorieren zu ( <script>
, <style>
, <svg>
, <head>
, <object>
in den Sinn kommen!) , Weil sie wahrscheinlich lesbaren Inhalt nicht in dem Sinne enthalten sind wir nach. Was Sie dort tun, hängt von Ihren Umständen ab und davon, wie weit Sie gehen möchten. Mit HtmlAgilityPack ist es jedoch ziemlich trivial, ausgewählte Tags auf die Whitelist oder Blacklist zu setzen.
Wenn Sie den Inhalt wieder auf eine HTML-Seite rendern, stellen Sie sicher, dass Sie die XSS-Sicherheitsanfälligkeit verstehen und wissen, wie Sie sie verhindern können. Codieren Sie daher immer den vom Benutzer eingegebenen Text, der wieder auf eine HTML-Seite gerendert wird ( >
wird >
usw.).