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中获取它?
答案 0 :(得分:2)
无论如何,Caja都需要iframe
。这两种执行模式都需要一组JavaScript全局变量(通过创建框架获得),可以对其进行根本修改以实现安全执行。
Modern Caja(ES5模式)不需要任何服务器端编译步骤;如果浏览器兼容,您可以以标准方式使用Caja,永远不会联系服务器。要强制执行此操作,请在es5Mode: true
的选项中指定caja.initialize
。
您可以加载访客代码一次并重复执行;只需提供api
即可让客人在加载时传递一个功能,然后随时调用该功能。
对于您的使用案例,也可以使用Sja,Caja的现代安全评估子系统,而根本不使用Caja本身;这将允许您跳过任何iframe,但需要您以SES兼容的方式编写代码;就是这样,
Object.prototype
和Object.freeze()
保护直接或间接暴露于用户提供的代码的所有对象。)如果你想要它,我建议你直接使用SES,因为它消除了许多间接性和完全复杂性,但它需要理解概念才能在安全方面取得成功。