32

我需要在我的网站上提供用户提交的脚本(有点像jsfiddle)。我希望脚本以安全的方式在访问者浏览器上运行,与提供它们的页面隔离。由于代码是用户提交的,因此不能保证其可信。

现在我能想到三个选项:

  • 在不同域的 iframe 中提供用户提交的内容,并依赖同源策略。这将需要设置一个额外的域,如果可能的话我想避免。我相信这就是 jsfiddle 的做法。该脚本仍然会造成一些损害,例如更改top.location.href,这不太理想。http://jsfiddle.net/PzkUw/
  • 使用沙盒属性。我怀疑这在浏览器中没有得到很好的支持。
  • 在提供脚本之前对其进行消毒。我宁愿不去那里。

上面还有其他解决方案或建议吗?

更新

如果我怀疑第一个选项是最好的解决方案,那么除了更改顶部窗口位置之外,恶意脚本还能做什么,我该如何防止这种情况发生?我可以根据静态代码分析来操作或拒绝某些脚本,但考虑到可以访问对象的方式数量以及一般静态分析 javascript 的难度,这很难至少,它需要一个成熟的解析器和一些复杂的规则(一些,但我怀疑不是全部,其中一些存在于 JSLint 中)。

4

4 回答 4

26

创建一个定义良好的消息接口,并将 JavaScript Web Worker 用于您想要沙箱的代码。HTML5 网络工作者

Web Workers 无权访问以下 DOM 对象。

  • 窗口对象

  • 文档对象

  • 父对象

因此他们无法重定向您的页面或更改其中的数据。

您可以创建模板和定义良好的消息传递界面,以便用户可以创建 Web Worker 脚本,但您的脚本将对被操纵的内容拥有最终决定权。

编辑Jordan Gray 的评论插入了一个似乎可以完成我上面描述的 JavaScript 库。https://github.com/eligrey/jsandbox

于 2012-09-25T14:49:28.127 回答
5

一些可能对您的应用程序有帮助的工具的想法 - 它们从两个不同的方向解决问题:Caja 将不受信任的 JavaScript 代码编译为安全的东西,而 AdSafe 定义了可以安全使用的 JavaScript 子集。

卡哈

卡哈

Caja 编译器是一个工具,可以让第三方 HTML、CSS 和 JavaScript 安全地嵌入到您的网站中。它支持嵌入页面和嵌入应用程序之间的丰富交互。Caja 使用对象能力安全模型来支持广泛的灵活安全策略,以便您的网站可以有效地控制嵌入式第三方代码可以对用户数据执行的操作。

广告安全

广告安全

ADsafe 可以安全地将访客代码(例如第三方脚本广告或小部件)放在网页上。ADsafe 定义了一个足够强大的 JavaScript 子集,允许访客代码执行有价值的交互,同时防止恶意或意外损坏或入侵。ADsafe 子集可以通过 JSLint 等工具进行机械验证,因此无需人工检查即可检查访客代码的安全性。ADsafe 子集还强制执行良好的编码实践,增加来宾代码正确运行的可能性。

于 2012-09-23T02:31:17.520 回答
3

如前所述,主要浏览器已经支持该sandbox属性iframe,但我另外建议一个混合解决方案:在沙盒 iframe 中启动一个 web-worker。这将提供一个单独的线程,并保护沙盒 iframe 的 DOM 免受不受信任的代码的影响。这就是我的Jailed图书馆的工作方式。此外,您可以通过将任何一组函数导出到沙箱中来解决任何限制。

于 2014-10-19T02:46:25.773 回答
-4

如果您想通过删除某些代码的访问权限来沙箱化某些代码windowdocumentparent元素,您可以通过将其包装在一个闭包中来实现它,其中这些是局部空变量:

(function(window, document, parent /* Whatever you want to remove */){
  console.log(this);      // Empty object
  console.log(window);    // undefined
  console.log(document);  // undefined
  console.log(parent);    // undefined
}).call({});

用空对象调用它很重要,否则this将指向窗口对象

于 2012-09-27T21:35:02.803 回答