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

标签 javascript iframe google-caja

看来 official examples使用caja.js文件只是包装一个 iframe 以从托管 caja 编译服务的服务器加载 URL,而后者又从某个 URL 获取其输入。相关的 API 可用 here .

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

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

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

最佳答案

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

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

您可以一次加载访客代码并重复执行;只需提供一个 api 即可让 guest 在加载函数时将其传递出去,然后随时调用该函数。


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

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

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

关于javascript - 使用 Google Caja 运行用户提供的 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22535495/

相关文章:

javascript - .show() 在 'display :block' 之后不起作用

javascript - ASP MVC Controller 发布具有不同值的相同 html 输入名称

javascript - 我可以在 Javascript 中使用变量进行 'if' 查询吗?

html - visibility :hidden freezes animation inside iframe in Chrome and Opera (WebKit likely)

html - 某些 CSS 属性未在 iframe 中应用

javascript - 网站上的恶意软件,但它是如何到达那里的

javascript - 谷歌银行 : Sample html4 def file?

php - 在 Jquery 中使用数组

javascript - 服务器端的哄骗

javascript - 使用 caja 清理 Javascript?