【问题标题】:Using Google Caja to run user-supplied Javascript使用 Google Caja 运行用户提供的 Javascript
【发布时间】:2014-03-20 14:08:23
【问题描述】:

似乎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 获取它?

【问题讨论】:

    标签: javascript iframe google-caja


    【解决方案1】:

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

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

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


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

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

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

    【讨论】:

    • 很好的答案。还有一个问题:有示例代码吗?因为标准示例不这样做。
    • developers.google.com/caja/docs/callingguestcode 是主机调用来宾编写函数的示例。
    • 对不起,我应该更明确一点。我的意思是 SES 代码示例?给定的示例仅使用 iframe,并且始终通过 URL 提供来宾代码。
    • @Domi 好问题。我不知道在 Mark Miller 的论文之外是否真的有任何 example SES 代码。我认为这是一个很好的问题,可以在the mailing list 上提出,看看是否有人记忆犹新,是否没有开始讨论该写什么。
    • @Domi Die 你在这方面取得了成功吗?我也会对此感兴趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多