【发布时间】:2016-09-26 13:03:06
【问题描述】:
我需要在网页上显示字符串内容(我无法控制)。除了某些有限数量的 HTML 标记(strong、em、p、br)外,所有内容都应按原样显示。那些应该受到尊重,我的理解是让他们逃脱是安全的。其他所有内容都应按原样显示。
令人惊讶的是,大多数 HTML Sanitizer 确实具有侵入性,因为它们旨在删除他们认为“不安全”的内容。这是为什么?为什么他们不默认转义而不是删除?我是否应该按照以下方式进行黑客攻击?
var encoded = System.Web.Security.AntiXss.AntiXssEncoder.HtmlEncode("string content");
var encodedWithSafeTagsReenabled = encoded.Replace("<strong>", "<strong>");
在 2016 年的 .NET 生态系统中是否有更清洁、更强大的方法来做到这一点?同样,尊重标签白名单并保留(编码,而不是删除)其他所有内容?
* 澄清一下,这将用于将内容放置在网页上的特定 div 中(我知道编码应该是基于 OWASP XSS 备忘单的上下文相关的)。
【问题讨论】:
-
大多数 HTML sanitizer 依赖于实际构建文档模型并使用节点,而不是尝试破坏字符串。因此,必须删除或以其他方式“修复”无效的 HTML,否则构建文档模型将失败。
-
谢谢,明白了。他们构建 DOM 或其他什么,但我的问题是为什么他们在最后转储到字符串时不默认编码?为什么它们必须是侵入性的和移除的?如果内容甚至不是有效的 DOM 怎么办?我要求他们为 html 输出清理任意字符串(不检查 html 有效性)。
-
再说一次,他们就是这样工作的。在处理 HTML 之类的内容时,您要么必须 1) 使用昂贵且容易出错的正则表达式,要么 2) 构建某种内存中的、基于类的表示来进行修改,然后将其展平为字符串.大多数使用 HTML 的库都选择第二条路径,这意味着它们必须依赖 标准 来构建该对象图。这进一步意味着任何不符合这些标准(无效)的东西都必须丢弃或以其他方式处理。
标签: html asp.net asp.net-mvc xss html-sanitizing