2

我从一个不可靠的来源下载了一些 html 树,并使用它在我的页面中将内容显示为某个 HTML div 的子项。但是,此下载的代码存在运行脚本/或在事件处理程序中执行脚本的危险。是否有可能在 HTML 中就像使用标签来定义脚本一样,做一个

<noscriptex>
    <script>
        ...
    </script>
</noscriptex>

那么浏览器不会在这个标签内执行任何代码?

如果没有这样的东西,我如何清理下载的 HTML 以显示带有 CSS 的 DOM 元素而不涉及任何脚本?

4

3 回答 3

1

您可以使用函数从标记中删除脚本,例如

function stripScripts(markup) {

    var div = document.createElement('div');
    var frag = document.createDocumentFragment();

    div.innerHTML = markup;

    var scripts = div.getElementsByTagName('script');
    var i = scripts.length;

    while (i--) {
      scripts[i].parentNode.removeChild(scripts[i]);
    }

    while (div.firstChild) {
      frag.appendChild(div.firstChild);
    }
    return frag;
}

使用 innerHTML 插入的任何脚本元素都不会执行,因此它们是安全的。它们也不在 DOM 中,因此功能有限。

注意createDocumentFragment返回的对象可以直接插入到DOM中,函数返回的fragment没有脚本元素。

于 2012-09-19T04:54:35.623 回答
1

不; 没有这样的功能。

相反,您需要解析 HTML 并使用严格的白名单删除任何无法识别的标签和属性。

您还需要验证属性值;特别是网址。

于 2012-09-19T04:03:19.320 回答
0

这就是 iframe 的用途。如果内容来自与主机页面不同的域,则不允许与任何其他内容进行通信。你可以让它运行脚本到它的核心内容,它们不会影响你的页面部分。

于 2012-09-19T05:52:55.300 回答