我想允许我的应用程序的用户用 Javascript 编写插件来扩展其功能,而不允许访问我提供的插件 API 对象以外的任何东西。例如,插件可能如下所示:
plugin.hookSomeUserAction(function() {
plugin.doSomethingWickedAwesome();
document.title = 'hacked!'; //shouldn't work
});
Caja 看起来应该能够完成工作,但文档可能是我见过的任何开源项目中最糟糕的(相当成就!)。我需要一些帮助来设置系统。
我已经让 cajoler 在命令行上工作,并且我已经将一个这样的插件哄骗到某种有希望净化的 Javascript 中。被哄骗的 Javascript 看起来像是期望提供一个“IMPORTS___”对象,它应该包含插件可以访问的所有内容。到目前为止非常有希望!
不幸的是,让那个被哄骗的 Javascript 文件真正加载和运行变得一团糟。不幸的是,文档中的源代码片段完全错误,因为函数 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()的对象吗?