何时使用document.implementation.createHTMLDocument

When to use document.implementation.createHTMLDocument?

本文关键字:createHTMLDocument implementation document 何时使      更新时间:2023-09-26

有哪些用例,是否已弃用?正如我在http://groups.google.com/group/envjs/browse_thread/thread/6c22d0f959666009/c389fc11537f2a97上发现的那样,它是"非标准的,不被任何现代浏览器支持"。

关于document.implementation at http://javascript.gakaa.com/document-implementation.aspx:

返回对W3C DOMImplementation对象的引用,该对象在一定程度上代表了构成……的环境文档容器,浏览器,对于我们的目的。对象的方法让您看到浏览器报告支持哪些DOM模块。这对象也是创建虚拟W3C Document和当前文档树之外的DocumentType对象。因此,在可以使用Netscape 6的文档。Implementation属性作为开始为外部XML文档生成非呈现文档。看到有关方法及其详细信息的DOMImplementation对象浏览器支持。

既然它提供了在当前文档树之外创建非呈现文档的方法(比如createHTMLDocument),那么向它提供可能包含某些XSS的不受信任的第三方HTML输入是否安全?我问,因为我想使用createHTMLDocument遍历第三方HTML输入的目的。那可能是用例之一吗?

我总是使用这个,因为它不会请求图像,执行脚本或影响样式:

function cleanHTML( html ) {
    var root = document.implementation.createHTMLDocument().body;
    root.innerHTML = html;
    //Manipulate the DOM here
    $(root).find("script, style, img").remove(); //jQuery is not relevant, I just didn't want to write exhausting boilerplate code just to make a point
    return root.innerHTML;
}

cleanHTML( '<div>hello</div><img src="google"><script>alert("hello");</script><style type="text/css">body {display: none !important;}</style>' );
//returns "<div>hello</div>" with the page unaffected

是。您可以使用它来加载不受信任的第三方内容,并在将其包含到您自己的文档之前删除其危险标记和属性。有一些很棒的研究结合了这个技巧,描述在http://blog.kotowicz.net/2011/10/sad-state-of-dom-security-or-how-we-all.html。

上面Esailija所记录的技术是不够的。您还需要去掉大多数属性。攻击者可以将onerror或onmouseover元素设置为恶意JS。style属性可以用来包含运行恶意JS的CSS。Iframe和其他嵌入标签也可能被滥用。在https://html5sec.org/xssme/xssme2查看源代码以查看该技术的一个版本。

除了@Esailija和@Greg之外,还有一个更简洁的答案:这个函数将在当前文档的树之外创建另一个文档,并清除新文档中的所有脚本,样式和图像:

function insertDocument (myHTML) {
    var newHTMLDocument = document.implementation.createHTMLDocument().body;
    newHTMLDocument.innerHTML = myHTML;
    [].forEach.call(newHTMLDocument.querySelectorAll("script, style, img"), function(el) {el.remove(); });
    documentsList.push(newHTMLDocument);
    return $(newHTMLDocument.innerHTML);
}

这个对于ajax请求和抓取内容来说是非常棒的:)

相关文章:
  • 没有找到相关文章