在每个人都告诉我不应该进行客户端清理之前(我确实打算在客户端上进行,尽管它也可以在 SSJS 中工作),让我澄清一下我正在尝试做什么。
我想要一些类似于Google Caja或HTMLPurifier但用于 JavaScript 的东西:一种处理 HTML 和 CSS 的基于白名单的安全方法(当然还没有插入到 DOM 中,这不安全,但首先以字符串形式获得)然后有选择地过滤掉不安全的标签或属性,忽略它们或选择性地将它们作为转义文本包括在内,或者以其他方式允许将它们报告给应用程序以进行进一步处理,理想情况下是在上下文中。如果它也可以将任何 JavaScript 减少到一个安全的子集,就像在 Google Caja 中一样,那将是很酷的,但我知道这会要求很多。
我的用例是访问通过JSONP获得的不受信任的 XML/XHTML 数据(在 wiki 处理之前来自 Mediawiki wiki 的数据,从而允许原始但不受信任的 XML/HTML 输入)并允许用户对该数据进行查询和转换(XQuery、jQuery、 XSLT 等),利用 HTML5 允许离线使用、IndexedDB 存储等,然后可以在用户查看输入源并构建或导入查询的同一页面上预览结果。
用户可以产生他们想要的任何输出,所以我不会清理他们正在做的事情——如果他们想将 JavaScript 注入页面,他们将全力以赴。但我确实想保护那些希望有信心添加代码的用户,这些代码可以安全地从不受信任的输入中复制目标元素,同时禁止他们复制不安全的输入。
这绝对应该是可行的,但我想知道是否有任何图书馆已经这样做了。
如果我坚持自己实现这一点(尽管我对这两种情况都很好奇),我想证明innerHTML
在插入文档之前使用或 DOM 创建/附加是否在各个方面都是安全的。例如,如果我第一次运行DOMParser
或依赖浏览器 HTML 解析通过使用innerHTML
将原始 HTML 附加到未插入的 div,是否会意外触发事件?我相信它应该是安全的,但不确定 DOM 操作事件是否会在插入之前以某种方式发生,这可能会被利用。
当然,在那之后构建的 DOM 需要进行清理,但我只是想验证我是否可以安全地构建 DOM 对象本身以便于遍历,然后担心过滤掉不需要的元素、属性和属性值。
谢谢!