javascript - 使用 caja 清理 Javascript?

标签 javascript google-caja

我想允许我的应用程序的用户使用 Javascript 编写插件来扩展其功能,但不允许访问我提供的插件 API 对象以外的任何内容。例如,插件可能如下所示:

plugin.hookSomeUserAction(function() {
    plugin.doSomethingWickedAwesome();
    document.title = 'hacked!'; //shouldn't work
});

Caja 看起来应该能够完成工作,但文档可能是我见过的所有开源项目中最糟糕的(相当了不起!)。我需要一些帮助来设置系统。

我已经让诱骗者在命令行上工作,并且我已经将一个这样的插件诱骗到某种希望经过净化的 Javascript 中。被哄骗的 Javascript 看起来像是在期待提供一个“IMPORTS___”对象,该对象应该包含插件可以访问的所有内容。到目前为止很有前途!

不幸的是,让这个被哄骗的 Javascript 文件实际加载和运行已经变得一团糟。源代码片段 in the docs不幸的是,这是完全错误的,因为函数 loadCaja 实际上并没有出现在 google-caja 的当前主干中的任何地方。我找到了一些至少可以做一些事情的代码:

<div id="plugin"></div>
<script>
    caja.configure({
        cajaServer: "/js/caja"
    }, function(frameGroup) {
        frameGroup.makeES5Frame(document.getElementById('plugin'),
            { /* No network access */ },
            function(frame) {
                frame.url('/js/plugins/test.js')
                    .run({});
            }
        );
    });
</script>

不幸的是,这样做是试图让哄骗者重新哄骗我已经哄骗过的 javascript。我绝对有兴趣让服务器根据每个请求重新哄骗每个插件;我会在上传后哄骗它并将其存储起来以备使用。

我也找不到任何关于如何或在何处指定导入 IMPORTS___ 的文档(考虑到这是整个安全模型,这似乎是文档中的一个奇怪的疏忽)。这是传递给 .run() 的对象吗?

最佳答案

有趣的是,我对 Caja 的唯一了解来自于只阅读了 SES 的源代码并且不了解其使用上下文的 Angular 。我发现与外部存在或不存在的任何文档相比,源代码的文档记录非常完备。

http://code.google.com/p/es-lab/source/browse/trunk/src/ses/initSES.js

关于javascript - 使用 caja 清理 Javascript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8945712/

相关文章:

Javascript 代码片段在 Safari 11 和 12 中不起作用

javascript - 使用 Google HtmlService 提供输入模式属性时不起作用

google-apps-script - 如何让 Caja 在脚本标签中保留模板文本?

javascript - 如何在 Node.js 下使用 Google 的 Caja HTML Sanitizer 将标签列入白名单?

javascript - 如何在 React JS 的 html 属性中编写 JavaScript 代码

javascript - socket.io 服务器对象选项,两者之间有什么影响?

javascript - Vue - 如何从 Vuex 访问组件的属性

javascript - Perl 哈希到 JavaScript 数组的长度爆炸

javascript - Google caja - 阻止恶意代码

Java:解析 JavaScript 并标记错误