我希望允许应用程序的用户用Javascript编写扩展其功能的插件,而不允许访问我提供的插件API对象以外的任何东西。例如,插件可能如下所示:
plugin.hookSomeUserAction(function() {
plugin.doSomethingWickedAwesome();
document.title = 'hacked!'; //shouldn't work
});Caja看起来应该能够完成任务,但是文档可能是我见过的任何开源项目中最糟糕的(相当大的成就!)我需要有人帮我把系统准备好。
我已经让诱骗者在命令行上工作了,我还诱使一个这样的插件变成了某种有希望被净化的Javascript。被诱骗的Javascript看起来像是在期待提供一个"IMPORTS___“对象,这个对象应该包含插件可以访问的所有内容。到目前为止很有希望!
不幸的是,让被诱骗的Javascript文件实际加载和运行已经变成了一片混乱。不幸的是,源代码片段在医生里完全错了,因为loadCaja函数实际上并没有出现在google的当前主干中。我找到了一些代码,这些代码至少能做些什么
<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()的对象吗?
发布于 2012-02-07 08:04:05
有趣的是,我对Caja唯一的知识来自于只阅读了SES的源代码,而不知道上下文的使用。我发现,与外部存在或不存在的任何文档相比,源代码是非常好的文档。
http://code.google.com/p/es-lab/source/browse/trunk/src/ses/initSES.js
https://stackoverflow.com/questions/8945712
复制相似问题