我需要在我的网站上提供用户提交的脚本(有点像 jsfiddle )。我希望脚本以安全的方式在访问者浏览器上运行,与它们所服务的页面隔离。由于代码是由用户提交的,因此无法保证其可信度。
现在我能想到三个选项:
- 在来自不同域的 iframe 中提供用户提交的内容,并依赖同源策略。这将需要设置一个额外的域,我希望尽可能避免。我相信 jsfiddle 就是这样做的。该脚本仍然会造成一些损害,例如更改
top.location.href
,这不太理想。 http://jsfiddle.net/PzkUw/ - 使用 sandbox attribute 强>。我怀疑这在浏览器中没有得到很好的支持。
- 在提供脚本之前对其进行清理。我宁愿不去那里。
有没有其他的解决方案,或者针对以上的建议?
更新
如果正如我所怀疑的那样,第一个选项是最佳解决方案,除了更改顶部窗口位置之外,恶意脚本还能做什么,我该如何防止这种情况发生?我可以操纵或拒绝某些基于静态代码分析的脚本,但这是 hard考虑到可以访问对象的方式的数量以及一般静态分析 javascript 的难度。至少,它需要一个成熟的解析器和一些复杂的规则(一些,但我怀疑不是全部,其中存在于 JSLint 中)。
最佳答案
创建一个定义良好的消息接口(interface),并使用 JavaScript Web Worker 处理您要沙盒化的代码。 HTML5 Web Workers
Web Worker 无权访问以下 DOM 对象。
窗口对象
文档对象
父对象
因此他们无法重定向您的页面或更改其中的数据。
您可以创建一个模板和一个定义良好的消息传递接口(interface),以便用户可以创建 Web Worker 脚本,但您的脚本将对操作的内容拥有最终决定权。
编辑 Jordan Gray 的评论插入了一个 JavaScript 库,该库似乎可以执行我上面描述的操作。 https://github.com/eligrey/jsandbox
关于javascript - 我如何对不受信任的用户提交的 JavaScript 内容进行沙盒处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12209657/