javascript - 我如何对不受信任的用户提交的 JavaScript 内容进行沙盒处理?

标签 javascript iframe sandbox same-origin-policy

我需要在我的网站上提供用户提交的脚本(有点像 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/

相关文章:

security - 不受信任的 GPGPU 代码(OpenCL 等) - 安全吗?有什么风险?

javascript - 使功能分别影响每个测验ID

javascript - 谁能解释一下jquery中函数的执行过程

javascript - Flot JS 折线图 按不同属性排序

html - Position relative 和 Position fixed 后面

javascript - 拼图 : different domain iframe needs to dynamically "overlap" parent content

iframe - 内容安全策略、X-Frame-Options 和 localhost

javascript - 如何只允许白名单资源(脚本、像素等)在沙盒 iframe 中运行?

javascript - 如何使用 Reactjs 更新 Google 电子表格中的特定行?

linux - 在线评委沙盒