HTML Javascript - 防止从dom树的子节点执行脚本

时间:2012-09-19 03:59:11

标签: javascript html execution

我从一个不值得信任的来源下载一些html树,并使用它来显示内容作为我页面中某些HTML div的子项。但是,下载的代码存在运行脚本/或在事件处理程序中执行脚本的危险。是否可以在HTML中使用标签来定义脚本,执行

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

然后浏览器不会执行此标记内的任何代码?

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

3 个答案:

答案 0 :(得分:1)

没有;没有这样的功能。

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

您还需要验证属性值;尤其是网址。

答案 1 :(得分: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中,函数返回的片段没有脚本元素。

答案 2 :(得分:0)

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