Javascript 何时使用document.implementation.createHTMLDocument?

Javascript 何时使用document.implementation.createHTMLDocument?,javascript,Javascript,什么是一些用例?它是否已弃用?正如我在会议上发现的那样,它是“非标准的,任何现代浏览器都不支持” 关于文档.实施位于: 返回对W3C DOMImplementation对象的引用,该对象 在一定程度上表示构成环境的环境 文档容器浏览器,用于我们的目的。对象的方法 让您查看浏览器报告支持哪些DOM模块。这 对象也是创建虚拟W3C文档和 当前文档树之外的DocumentType对象。因此,在 Netscape 6您可以使用document.implementation属性作为开始 为外部XML文档生

什么是一些用例?它是否已弃用?正如我在会议上发现的那样,它是“非标准的,任何现代浏览器都不支持”

关于
文档.实施
位于:

返回对W3C DOMImplementation对象的引用,该对象 在一定程度上表示构成环境的环境 文档容器浏览器,用于我们的目的。对象的方法 让您查看浏览器报告支持哪些DOM模块。这 对象也是创建虚拟W3C文档和 当前文档树之外的DocumentType对象。因此,在 Netscape 6您可以使用document.implementation属性作为开始 为外部XML文档生成未指定名称的文档。看见 DOMImplementation对象获取有关方法及其特性的详细信息 浏览器支持


鉴于它提供了在当前文档树之外创建非呈现文档的方法(如
createHTMLDocument
),向其提供可能包含某些XS的不受信任的第三方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
函数清除html(html){
var root=document.implementation.createHTMLDocument().body;
root.innerHTML=html;
//在这里操纵DOM
$(root).find(“script,style,img”).remove();//jQuery与此无关,我只是不想为了说明问题而编写冗长的样板代码
返回root.innerHTML;
}
cleanHTML('helloalert(“hello”);body{display:none!important;}');
//返回“hello”,页面不受影响

是。您可以使用它加载不受信任的第三方内容,并在将其包含到您自己的文档中之前将其去除危险的标记和属性。有一些伟大的研究结合了这个技巧,在


然而,上述Esailija记录的技术是不够的。您还需要去掉大多数属性。攻击者可以将onerror或onmouseover元素设置为恶意JS。style属性可用于包含运行恶意JS的CSS。Iframe和其他嵌入标记也可能被滥用。查看源代码以查看此技术的版本。

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

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请求和抓取内容来说非常棒:)

根据,
createHTMLDocument
在旧版本的IE或Firefox中不可用。IE9显然支持它,而我自己的测试表明FF7支持它。而且它是坏的。我想这是相同代码的副本:。更新答案以指向那里。原始URL是使用样板代码=
[].forEach.call(document.queryselectoral(“脚本、样式、img”)、函数(el){el.remove();})生成的