我发现this要求使用with
和the Harmony direct proxies为第三方代码实施沙箱。它有用吗?是否可以使用代理实现正确的javascript沙箱?这种方法有什么怪癖和/或缺点?
(我正在寻找这个问题中仅限javascript的解决方案,所以没有Caja和类似的服务器端项目)
答案 0 :(得分:1)
原则上,这种方法应该可行。但是,有几点需要注意:
显然,这需要将所有不受信任的代码放入范围内。在实践中,这可能会变得相当笨拙。
此外,它巧妙地改变了该代码中包含的最外层var / function声明的含义,该声明现在变为局部而不是全局对象的属性。另一方面,未声明的变量仍然会以全局对象结束。这可能会打破一些程序。
由于'with'的疯狂语义,现代JavaScript VM放弃了在其范围内优化代码的大多数尝试。对于具有“with”的内容,生成的代码可能会慢两个数量级。
总的来说,我不推荐这种方法。使用SES或Caja你会好得多(不确定你称之为服务器端)。
(同样值得注意的是,ES6的模块加载器将提供一种更清晰的方法来对全局对象进行沙箱化。但是很难说这些方法何时可用。不会很快。)