使用Google Caja运行用户提供的Javascript

时间:2014-03-20 14:08:23

标签: javascript iframe google-caja

official examples似乎使用caja.js文件只包装iframe从托管caja编译服务的服务器加载URL,而后者又从其获取输入一些网址。相关的API可用here

然而,我真正想要的是安全地(并重复地)运行用户提供的Javascript片段,如下所示:

for (var i = 0; i < N; ++i) {
    var x = getUserResult(currentState);
    updateState(currentState, x);
}

有没有办法直接这样做?代码here具有编译器。为什么我不能只使用它来编译代码然后在模拟上下文中运行它?是因为在浏览器中获取安全上下文的唯一方法是iframe吗?如果是这样,有没有办法可以使用iframe直接运行给定的源代码,而无需从外部URL中获取它?

1 个答案:

答案 0 :(得分:2)

无论如何,Caja都需要iframe。这两种执行模式都需要一组JavaScript全局变量(通过创建框架获得),可以对其进行根本修改以实现安全执行。

Modern Caja(ES5模式)不需要任何服务器端编译步骤;如果浏览器兼容,您可以以标准方式使用Caja,永远不会联系服务器。要强制执行此操作,请在es5Mode: true的选项中指定caja.initialize

您可以加载访客代码一次并重复执行;只需提供api即可让客人在加载时传递一个功能,然后随时调用该功能。


对于您的使用案例,也可以使用Sja,Caja的现代安全评估子系统,而根本不使用Caja本身;这将允许您跳过任何iframe,但需要您以SES兼容的方式编写代码;就是这样,

  • 避免修改Object.prototype
  • 等全局对象
  • 使用Object.freeze()保护直接或间接暴露于用户提供的代码的所有对象。)

如果你想要它,我建议你直接使用SES,因为它消除了许多间接性和完全复杂性,但它需要理解概念才能在安全方面取得成功。