2016-09-26 13 views
2

我需要在网页上显示一个字符串内容(我没有控制权)。除了某些有限数量的HTML标签(强,em,p,br)外,所有东西都应该显示。这些应该得到尊重,我的理解是可以安全地让它们不被转用。其他一切都应该按原样显示。.NET中的选择性HTML编码(除了某些标签以外的所有东西)?

令人惊讶的是,大多数HTML Sanitizer都是真正的侵入性,因为它们适合去除他们认为是“不安全”的东西。这是为什么?他们为什么不拖延而不是去掉?我应该保留沿线

var encoded = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode("string content"); 
var encodedWithSafeTagsReenabled = encoded.Replace("&lt;strong&gt;", "<strong>"); 

2016年有没有更清洁,更强大的方式在.NET生态系统中做到这一点?再次,尊重标签的白名单并保留(编码,而不是删除)其他一切?要明确,这将用于将内容放置在网页上的特定div(我知道编码应该是基于OWASP XSS备忘单的上下文相关)。

+0

大多数HTML消毒剂依赖于实际构建一个文档模型,并与节点的工作,而不是试图裂伤一个字符串。因此,无效HTML必须被移除或以其他方式“固定”,否则构建文档模型将失败。 –

+0

谢谢,理解。他们构建DOM或其​​他任何东西,但我的问题是为什么他们最终倾倒到一个字符串时没有默认编码?为什么他们必须插入并删除?如果内容甚至不是有效的DOM?我要求他们清理html输出的任意字符串(不检查html有效性)。 – Blinky

+0

再次,*他们是如何工作*。当处理类似HTML的东西时,你必须1)使用正则表达式,这是昂贵和容易出错的,或者2)构造某种内存中基于类的表示来进行修改,然后将其平坦化为一个字符串。大多数使用HTML的库选择第二条路径,这意味着它们必须依赖*标准*来构建该对象图。这进一步意味着任何不符合这些标准(无效)的东西都必须丢弃或以其他方式处理。 –

回答

0

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

例如,这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); 

}; 
相关问题