使用 createHTMLDocument 清理 HTML 是否安全?

信息安全 javascript xss 客户端
2021-09-02 08:06:30

我想知道createHTMLDocument用于进行 HTML 清理的安全性如何。我试图像这样实现它:

function sanitize(string) {
  var elm = document.implementation.createHTMLDocument().body;
  elm.innerHTML = string;
  // traverse and filter elm to only allow whitelisted elements and attributes
  // e.g. use https://github.com/gbirke/Sanitize.js
  var cleaned_fragment = whitelist_filter(elm);
  elm = document.implementation.createHTMLDocument().body;
  elm.appendChild(cleaned_fragment);

  return elm.innerHTML;
}

它似乎可以很好地处理我抛出的所有 XSS 攻击(没有脚本评估或触发请求)。但我觉得这可能是个坏主意,我错过了什么?

如果有人想尝试,我已经创建了一个jsfiddle

2个回答

您应该DOMParser在可用时使用来解析 HTML,并且仅DOMImplementation.createHTMLDocument在前者不可用时才回退

在 Opera Presto 中,我通过时观察到网络活动<img src=...>(但不是<video>)。
Internet Explorer 9- 更糟糕:媒体、样式和事件侦听器将使用此方法激活。IE10+ 支持 DOMParser,所以如果您的观众使用 IE10+,那么您是安全的。

引用生成的 HTMLElement 的 innerHTML 会导致 mXSS - 一种基于 DOM 的 XSS。

例如,下面的代码会导致 IE 出现 mXSS。

var s = "<listing>&lt;img src=1 onerror=alert(1)&gt;</listing>";
var parser = new DOMParser();
var doc = parser.parseFromString( s, "text/html" );
div.innerHTML = doc.body.innerHTML;

因此,您必须作为 HTMLElement 操作,不要引用 innerHTML。

div.appendChild( doc.body.childNodes[ 0 ] );

http://utf-8.jp/public/20140807/shibuyaxss.pdfhttp://utf-8.jp/public/rickdom/