我从一个不值得信任的来源下载一些html树,并使用它来显示内容作为我页面中某些HTML div的子项。但是,下载的代码存在运行脚本/或在事件处理程序中执行脚本的危险。是否可以在HTML中使用标签来定义脚本,执行
<noscriptex>
<script>
...
</script>
</noscriptex>
然后浏览器不会执行此标记内的任何代码?
如果没有这样的东西,我如何清理下载的HTML只是为了显示带有CSS的DOM元素而不涉及任何脚本?
答案 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的用途。如果内容来自与主机页面不同的域,则不允许其与任何其他内容通信。你可以让它运行脚本到它的内容,它们不会影响你的页面部分。