Chrome App配置unsafe-eval后仍无法运行eval()的问题
'unsafe-eval'后仍报错的问题 看起来你遇到的问题是明明在manifest.json里配置了允许'unsafe-eval',但实际运行时CSP规则里并没有包含它,导致eval调用被拒绝。我来帮你拆解一下可能的原因和解决办法:
可能的原因
页面内的meta CSP标签覆盖了manifest配置
如果你的Chrome App加载的HTML页面里有类似<meta http-equiv="Content-Security-Policy">的标签,它会优先于manifest里的CSP配置,直接覆盖掉你设置的'unsafe-eval'规则,导致报错。manifest.json的CSP配置存在语法或结构问题
比如字段嵌套错误、引号/分号未正确闭合,都会导致配置不生效。Chrome版本或环境的特殊限制
部分旧版Chrome对Chrome App的CSP有更严格的默认限制,可能导致配置未被正确读取。
解决步骤
步骤1:检查并处理页面内的meta CSP标签
打开你加载的HTML页面,查找是否存在CSP meta标签:
- 如果有,直接删除它;
- 若需要保留,修改内容加入
'unsafe-eval':
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval'; object-src 'self';">
步骤2:验证manifest.json的配置正确性
确保你的manifest.json结构完全合规,比如:
{ "manifest_version": 2, "name": "Blockly", "version": "1.0.0", "icons": { "128": "icon_128.png" }, "permissions": [], "app": { "background": { "scripts": ["background.js"] } }, "minimum_chrome_version": "46", "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" }
注意:content_security_policy是顶级字段,不要嵌套在其他属性里;字段间的逗号分隔要正确(最后一个字段无需逗号)。
步骤3:尝试更安全的eval替代方案
虽然eval能解决问题,但它存在安全风险。你可以用Function构造器替代(同样需要'unsafe-eval'配置,但比直接用eval更可控):
window.addEventListener("load", function() { document.getElementById("myBtn").addEventListener("click", function() { let code = 'initiate();'; try { new Function(code)(); // 替代eval的执行方式 } catch (e) { console.log(e); } }); });
步骤4:重新加载Chrome App
删除已安装的Chrome App,重新加载解压后的扩展目录,确保新的manifest配置被Chrome正确读取。
如果以上步骤都无效,可以检查Chrome版本是否符合minimum_chrome_version: "46"的要求,或者尝试更新Chrome到最新稳定版。
内容的提问来源于stack exchange,提问作者Hisan

