JavaScript中的沙箱到底是什么?

10
我理解"沙盒"这个术语,但我的JS知识有限,无法帮助我理解JS中的沙盒技术。那么,什么是JS中的沙盒技术?除了安全之外,为什么我们需要对JS进行沙盒处理?

除了安全性之外,还有什么理由呢?整个重点是不允许来自Web的任意代码影响浏览器之外的任何事物。 - Wooble
@Wooble,请看下面的答案:除了安全性之外,还有一些额外的好处。我想补充说,这是一个很好的设计,因为JavaScript在全局方面非常糟糕。 - Keith Pinson
@Šime Vidas,是的,目前只有浏览器。 - Kumar
3个回答

3

沙箱化是创建一个范围,在其中应用程序的其他部分无法操作(除非给予机会)。更具体地说,这通常是一个函数范围,只公开了其中实际发生的有限子集。

建立在沙箱思想上的库之一是YUI3。应用程序的基本单元是一个YUI实例沙箱:

var Y = YUI(); // creates a configurable YUI instance

// Creates a sandbox for one part of your application,
// including the 'node' module.
Y.use('node', function(Z) {
    // Z is a YUI instance that's specific to this sandbox.
    // Operations inside it are protected from outside code
    // unless exposed explicitly. Any modules you request in
    // use statement will be separately instanced just for
    // this sandbox (in this case, the 'node' module)
    //
    // That way, if another part of your application decides
    // to delete Z.Node (or worse, replace it with a
    // malicious proxy of Z.Node) the code you've written
    // here won't be affected.
});

沙箱的优点主要在于减少应用程序的复杂性:由于沙箱是不可变的,因此它们更容易推理和验证。它们还可以提高运行时安全性,因为设计良好的沙箱应该能够作为页面上运行的其他脚本的黑盒子运行。它并不能防止所有可能的攻击,但它可以保护免受许多简单攻击的侵害。

我的宽带不喜欢这个问题,所以SO被阻止了 :( ,感谢您提供详细信息。看了你在jquery中的例子,我可以这样做 $(function(){/*一些代码*/});,这是你所说的吗? - Kumar
不完全相同,但很接近。最大的区别在于,如果我有一个使用模块AB的YUI实例,并且模块B恰好修改了模块A(添加了其他属性或更改了其行为),那么我可以稍后创建一个新的YUI实例,只使用模块A来获取未修改的版本。就我所知,在jQuery中几乎不可能做到这一点。 - Nick Husher

3
JavaScript沙箱正是做了您所说的事情。它限制了脚本可以执行的范围。此外,将脚本可以调用的资源虚拟化也有好处。这使得沙箱主机可以为更好的性能调度这些资源,并防止无休止循环的脚本导致整个浏览器崩溃。

0
沙盒技术可以创建一个有限的范围供脚本使用。假设你正在为一个网站编写代码,值得使用沙盒技术来避免在不确定是否按照预期工作时对现场进行编辑 - 而且没有测试是不可能真正确定的。即使它能够正常工作,如果你需要对JS进行一系列的修改,直到你喜欢为止,你很容易会在更新过程中干扰任何试图使用该网站的人。
此外,由于沙盒技术的有限性质,当你破坏东西时,更容易发现问题所在。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接