1

似乎官方示例使用了一个caja.js文件,该文件只是包装了iframe一个从托管 caja 编译服务的服务器加载 URL,而后者又从某个 URL 获取输入。相关的 API 可在此处获得。

但是,我真正想要的是安全地(并且反复地)运行用户提供的一段 Javascript,如下所示:

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

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

4

1 回答 1

2

iframe无论如何,卡哈都需要。两种执行模式都需要一组 JavaScript 全局变量(通过创建框架获得),这些全局变量可以被彻底修改以实现安全执行。

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

您可以加载一次来宾代码并重复执行它;只需提供一个api让来宾在加载时将函数传递出去,然后在您喜欢的时候调用该函数。


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

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

如果您愿意,我建议您直接使用 SES,因为它消除了许多间接性和总体复杂性,但它确实需要理解这些概念才能在安全方面取得成功。

于 2014-03-21T16:43:53.037 回答