如何沙箱不受信任的用户提交的JavaScript内容

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

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

现在我能想到三个选择:

从不同的域在 iframe 中提供用户提交的内容,并依赖于同源策略。这将需要设置一个额外的域,如果可能的话,我想避免这个域。我相信这就是 jsfiddle 的做法。该脚本仍然会造成一些损害,例如更改top.location.href,这是不理想的。http://jsfiddle.net/PzkUw/

使用sandbox attribute。我怀疑这不是很好地支持跨浏览器。

在提供脚本之前对其进行消毒。我宁愿不去那里。

是否有任何其他解决方案,或对上述建议?

Update

如果,正如我怀疑的那样,第一个选项是最好的解决方案,除了更改顶部窗口位置之外,恶意脚本还能做什么,我如何防止这种情况?我可以基于静态代码分析来操纵或拒绝某些脚本,但这是hard考虑到可以访问对象的方式数量以及静态分析 javascript 的难度。至少,它需要一些完整的可疑规则和

26

创建一个定义良好的消息接口,并将 JavaScript Web Worker 用于要沙箱的代码。HTML5 Web Workers

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

窗口对象

文档对象

父对象

所以他们不能重定向你的页面或改变它的数据。

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

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

5

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

Caja

Caja

Caja Compiler 是一种使第三方 HTML,CSS 和 JavaScript 安全地嵌入到您的网站中的工具。它可以在嵌入页面和嵌入式应用程序之间进行丰富的交互。Caja 使用对象功能安全模型来考虑各种灵活的安全策略,以便您的网站可以有效地控制嵌入的第三方代码可以对用户数据执行的操作。

AdSafe

AdSafe

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

3

如前所述,iframesandbox属性已经得到了主要浏览器的支持,但是我另外建议一个混合解决方案:在沙盒 iframe 中启动一个 web worker。这将提供一个单独的线程,并保护事件沙盒 iframe 的 DOM 免受不受信任的代码的影响。这就是我的Jailed库的工作方式。

-4

如果你想通过删除它的访问来沙箱一些代码说窗口文档元素,你可以通过包装它来实现它在一个闭包,其中这些是本地空变量:

(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将指向window对象

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(538)
css-如何在一行中使用不同数量的项目网格
上一篇
CSS中id和class的区别是什么我应该在什么时候使用它们
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(37条)