Chrome扩展CSP配置报错排查:已设宽松规则仍遭脚本拦截
看起来你遇到的问题确实有点头疼——明明配置了极其宽松的CSP,但Chrome还是报错说只允许script-src 'self' 'unsafe-eval'。我来帮你梳理几个容易遗漏的关键点:
1. 确认Manifest版本(最可能的核心原因)
如果你的扩展用的是Manifest V3,那问题大概率出在这里:V3对CSP的限制比V2严格得多,而且完全不支持你原来的V2风格的CSP写法。
- V3要求把CSP拆分为
extension_pages和sandbox等独立字段,并且有硬性规则:script-src里不能使用*通配符,也不允许unsafe-inline(样式的unsafe-inline是唯一例外)- Chrome会自动忽略所有不符合V3规则的CSP指令,导致实际生效的CSP被降级为默认的
script-src 'self' 'unsafe-eval',这正好和你看到的报错完全匹配!
针对V3,你需要修改CSP配置为类似这样:
"content_security_policy": { "extension_pages": "script-src 'self' 'unsafe-eval' https://myapp-12345.firebaseio.com; object-src 'none'; connect-src *; img-src * data: blob:; style-src 'self' 'unsafe-inline'; frame-src *;" }
这里特意把Firebase的域名明确加到script-src里,因为V3不允许模糊的通配符,必须指定具体的可信来源。
如果你的扩展是Manifest V2,可以试试把Firebase域名明确添加到script-src中(虽然*理论上包含它,但有时候Chrome对扩展CSP的通配符处理存在细微差异):
"content_security_policy": "default-src * 'unsafe-inline' 'unsafe-eval'; script-src * 'unsafe-inline' 'unsafe-eval' https://myapp-12345.firebaseio.com; connect-src * 'unsafe-inline'; img-src * data: blob: 'unsafe-inline'; frame-src *; style-src * 'unsafe-inline';"
2. 检查是否有Chrome策略强制覆盖CSP
如果你是在企业环境下使用Chrome,可能存在组策略强制设置了更严格的CSP规则,直接覆盖了你的扩展配置。你可以通过访问chrome://policy页面,查看是否有ExtensionContentSecurityPolicy相关的策略,若有则需要联系管理员调整。
3. 彻底排除缓存干扰
有时候单纯重新安装扩展还不够,Chrome可能残留了旧的CSP缓存。你可以试试:
- 用隐身模式测试扩展,隐身模式下不会加载缓存的扩展数据
- 进入
chrome://extensions/,开启开发者模式,点击你的扩展的"重新加载"按钮,再右键"检查"后台页面实时查看报错
4. 检查Firebase SDK的加载方式
那个报错的.lp脚本是Firebase Realtime Database的长轮询连接脚本。如果你的后台页面是V3的Service Worker,不能直接用DOM方式加载外部脚本,必须用importScripts(),而且要确保该脚本的域名在CSP的script-src中被明确允许。
另外,如果你是通过CDN加载Firebase SDK,也要确保CDN域名被加入script-src(比如官方CDN的https://www.gstatic.com)。
内容的提问来源于stack exchange,提问作者Miguel Stevens

