2012-09-19 184 views
2

我从一个不可信的源代码下载了一些html树,并使用它仅显示内容作为我页面中某些HTML div的子节点。但是,下载的代码有可能在事件处理程序中运行脚本/或执行脚本。是否有可能在HTML一样,使用标签来定义脚本,做一个HTML Javascript - 防止从dom树的子节点执行脚本

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

那么浏览器就不会这个标签中执行任意代码?

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

+0

您需要重新考虑这一点并在显示之前对输入进行清理。这样的代码只是在等待被利用。 – Blender

+0

@Blender:这正是他要求的, – SLaks

+0

@Slaks:我的不好。我不知何故错过了问题的最后一段...... – Blender

回答

1

否;没有这样的功能。

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

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

+0

无需解析,DOM可以用来查找和删除脚本元素而不执行它们。属性值更难处理,也许所有的处理程序(*)都可以设置为undefined? – RobG

+0

@RobG谢谢你,这是一个更好的建议,但代码和数据共同居住却是可怜的,但对文件系统或虚拟内存代码和数据页面等数据没有执行保护。 我不确定是否所有的处理程序都可以设置为undefined,甚至在至少调用了onLoad a la onCreate类型的某些处理程序之前。 – foobarometer

+0

@SLaks写一个解析器是很昂贵的,但我正在考虑它。 – foobarometer

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中,并且函数返回的片段没有脚本元素。

+0

保持在请注意,除'

  • 11. 防止执行cgi/perl脚本
  • 12. 从javascript dom文本节点替换 
  • 13. javascript执行后从DOM获取html
  • 14. htaccess的子目录,以防止脚本执行
  • 15. 防止节点上的某些类型的节点Primefaces树
  • 16. 防止从执行
  • 17. 防止从执行
  • 18. 从html执行python脚本
  • 19. 从HTML执行Webdriver脚本
  • 20. 防止PHP过早执行HTML表单脚本
  • 21. 如何防止jQuery.dialog将对话节点移动到DOM树的末尾?
  • 22. 防止子节点的鼠标事件
  • 23. 解释HTML DOM树>子节点概念简单
  • 24. 的Javascript:防止子类的功能是从父函数执行
  • 25. 防止JavaScript GET和脚本
  • 26. HTML无法访问的DOM节点,Javascript?
  • 27. 防止子级iframe脚本的父级DOM操作
  • 28. 从DOM树中提取节点值
  • 29. Bash - 防止脚本在错误时停止执行
  • 30. 节点exec无权执行脚本