我正在尝试使用Ext JS 5.1.0开发Google Chrome扩展程序。
当我尝试将ext-all.js添加到default_popup html中时,我发现Google Chrome扩展程序无法再使用动态脚本评估技术(如eval()或new Function()),或者将JS代码字符串传递给函数将导致使用eval(),如setTimeout()。
因此,在设置过程中,Google Chrome调试器会返回以下错误:
拒绝将字符串评估为JavaScript,因为'unsafe-eval'是 以下内容安全性中不允许使用脚本源 政策指令:“script-src'self'chrome-extension-resource:” ext-all-debug.js:8742 Ext.ClassManager.Ext.apply.getInstantiator
这是错误的代码
getInstantiator: function(length) {
var instantiators = this.instantiators,
instantiator, i, args;
instantiator = instantiators[length];
if (!instantiator) {
i = length;
args = [];
for (i = 0; i < length; i++) {
args.push('a[' + i + ']');
}
// The problem is here
instantiator = instantiators[length] = new Function('c','a','return new c(' + args.join(',') + ')');
instantiator.name = "Ext.create" + length;
}
return instantiator;
},
我找到了一个改变content_security_policy
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"
将此行添加到manifest.json
允许动态脚本评估技术(但这很危险)。
所以,我想保留标准的Google Chrome安全权限。 有没有办法解决这个问题?
答案 0 :(得分:1)
您可以查看此处列出的sandbox
方法:Build Apps with Sencha Ext JS
关于Chrome应用,但原则仍然适用。您可以使用清单中的sandbox
property创建一个沙盒网页,将其嵌入您的网页,然后使用postMessage
安全地与其进行通信。沙盒页面无法运行提升权限的Chrome API,从而使eval更安全。
同样,Chrome文档中有一篇名称恰当的文章:Using eval in Chrome Extensions. Safely.