.NET中的选择性HTML编码(除了某些标记之外的所有内容)?

时间:2016-09-26 13:03:07

标签: html asp.net asp.net-mvc xss html-sanitizing

我需要在网页上显示字符串内容(我无法控制)。除了某些有限数量的HTML标签(strong,em,p,br)之外,所有内容都应按原样显示。那些应该受到尊重,我的理解是让他们安全无懈可击。其他所有内容都应按原样显示。

令人惊讶的是,大多数HTML清洁剂都是侵入性的,因为它们的目的是去除他们认为“不安全”的东西。这是为什么?他们为什么不默认逃避而不是删除?我是否应该按照

的方式预留黑客
var encoded = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode("string content");
var encodedWithSafeTagsReenabled = encoded.Replace("&lt;strong&gt;", "<strong>");

2016年在.NET生态系统中有更清晰,更强大的方法吗?再次,尊重标签的白色列表并保留(编码,而不是删除)其他所有内容?

*为了澄清,这将用于将内容放置在网页上的特定div中(我知道编码应该基于OWASP XSS备忘单依赖于上下文。)

1 个答案:

答案 0 :(得分:0)

删除当然是最安全的选择。如果我们只对它进行html编码,那么如果有其他地方存在XSS错误,它可能是非htmlencoded。

例如这个jQuery脚本:

var searchText = searchstring.text();
if(noResults)
{
    $("div.noResults").html("no results found for <b>" + searchText + "</b>"); //boom
}
  

2016年在.NET生态系统中有更清晰,更强大的方法吗?再次,尊重标签的白色列表并保留(编码,而不是删除)其他所有内容?

您可以使用HtmlSanitizerNuGet)库执行此操作并使用RemovingTag事件:

var sanitizer = new HtmlSanitizer();
sanitizer.RemovingTag += (sender, args) =>
{

    var tag = args.Tag; 

    args.Cancel = true;
    tag.OuterHtml = WebUtility.HtmlEncode(tag.OuterHtml); 

};