我需要在我的网站上提供用户提交的脚本(有点像jsfiddle)。我希望脚本以安全的方式在访问者浏览器上运行,与提供它们的页面隔离。由于代码是用户提交的,因此不能保证其可信。
现在我能想到三个选项:
- 在不同域的 iframe 中提供用户提交的内容,并依赖同源策略。这将需要设置一个额外的域,如果可能的话我想避免。我相信这就是 jsfiddle 的做法。该脚本仍然会造成一些损害,例如更改
top.location.href
,这不太理想。http://jsfiddle.net/PzkUw/ - 使用沙盒属性。我怀疑这在浏览器中没有得到很好的支持。
- 在提供脚本之前对其进行消毒。我宁愿不去那里。
上面还有其他解决方案或建议吗?
更新
如果我怀疑第一个选项是最好的解决方案,那么除了更改顶部窗口位置之外,恶意脚本还能做什么,我该如何防止这种情况发生?我可以根据静态代码分析来操作或拒绝某些脚本,但考虑到可以访问对象的方式数量以及一般静态分析 javascript 的难度,这很难。至少,它需要一个成熟的解析器和一些复杂的规则(一些,但我怀疑不是全部,其中一些存在于 JSLint 中)。