【发布时间】:2013-05-29 10:29:11
【问题描述】:
我发现this 的要点是使用with 和the Harmony direct proxies 为第3 方代码实现沙箱。它有多大用处?是否可以使用代理实现适当的 javascript 沙箱?这种方法有什么怪癖和/或缺点?
(我在这个问题中寻找纯 JavaScript 的解决方案,所以没有 Caja 和类似的服务器端项目)
【问题讨论】:
标签: javascript sandbox ecmascript-harmony
我发现this 的要点是使用with 和the Harmony direct proxies 为第3 方代码实现沙箱。它有多大用处?是否可以使用代理实现适当的 javascript 沙箱?这种方法有什么怪癖和/或缺点?
(我在这个问题中寻找纯 JavaScript 的解决方案,所以没有 Caja 和类似的服务器端项目)
【问题讨论】:
标签: javascript sandbox ecmascript-harmony
原则上,这种方法应该可行。但是,有几点需要注意:
显然,这需要将 all 不受信任的代码放入 with 范围。在实践中,这可能会变得相当笨拙。
此外,它巧妙地改变了该代码中包含的最外层 var/function 声明的含义,这些声明现在变为本地而不是全局对象上的属性。另一方面,未声明的变量仍然会出现在全局对象上。这可能会破坏某些程序。
由于 'with' 的疯狂语义,现代 JavaScript VM 放弃了在其范围内优化代码的大多数尝试。对于带有'with'的东西,生成的代码很容易慢两个数量级。
所以总的来说,我不推荐这种方法。使用 SES 或 Caja 会好得多(不确定在哪种意义上您称它们为服务器端)。
(同样值得注意的是,ES6 的模块加载器将提供一种更简洁的方式来沙箱化全局对象。但很难说这些何时可用。不会很快。)
【讨论】: