Burada önerilen Regex tabanlı çözümlere baktım ve en önemsiz durumlar dışında beni hiçbir güvenle doldurmuyorlar. Bir öznitelikteki açılı ayraç, vahşi ortamdan yanlış biçimlendirilmiş HTML'yi bırakın, kırmak için gereken tek şeydir. Peki ya benzer varlıklar &
? HTML'yi düz metne dönüştürmek istiyorsanız, varlıkların da kodunu çözmeniz gerekir.
Bu yüzden aşağıdaki yöntemi öneriyorum.
HtmlAgilityPack'i kullanan bu uzantı yöntemi, tüm HTML etiketlerini bir html parçasından verimli bir şekilde çıkarır . Ayrıca gibi HTML varlıklarının kodunu çözer &
. Her metin öğesi arasında yeni bir satır olacak şekilde yalnızca iç metin öğelerini döndürür.
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();
}
Eğer gerçekten ciddi iseniz, çok (bazı HTML etiketleri içeriğini göz ardı etmek isterdim <script>
, <style>
, <svg>
, <head>
, <object>
muhtemelen biz peşinde anlamda okunabilir içeriğe sahip olmadığı için akla gelen!). Orada ne yapacağınız, koşullarınıza ve ne kadar ileri gitmek istediğinize bağlı olacaktır, ancak HtmlAgilityPack'i kullanarak, seçilen etiketleri beyaz listeye veya kara listeye almak oldukça önemsiz olacaktır.
Eğer bir HTML sayfasına içerik sırtını render iseniz, XSS açığı & anladığınızdan emin olun nasıl önleneceği - yani her zaman bir HTML sayfası (üzerine geri işlenen alır herhangi bir kullanıcı tarafından girilen metni kodlamak >
olur >
vs).