Chrome Manifest V3扩展注入外部脚本遇CSP错误求助
问题分析与解决办法
你遇到的核心问题是Manifest V3下chrome.scripting.executeScript的files参数不支持加载远程脚本——这个API的files字段仅允许引用扩展包内的本地资源,这是Manifest V3的硬性限制,和内容安全策略无关。另外你之前的CSP配置格式也不符合Manifest V3的要求。
解决步骤
1. 改用fetch加载远程脚本后注入
放弃files参数,先通过fetch获取远程脚本内容,再用func参数执行脚本:
fetch('https://www.example.com/script.js') .then(response => response.text()) .then(scriptContent => { chrome.scripting.executeScript({ target: { tabId: details.tabId }, func: (scriptCode) => { eval(scriptCode); }, args: [scriptContent] }); }) .catch(error => console.error('远程脚本加载失败:', error));
2. 修正CSP配置
因为用到了eval,需要在CSP中添加'unsafe-eval'(企业内部场景风险可控),同时按照Manifest V3的格式调整:
"content_security_policy": { "extension_pages": "script-src 'self' 'unsafe-eval' https://*.example.com; object-src 'self';", "content_scripts": "script-src 'self' https://*.example.com; object-src 'self';" }
extension_pages控制扩展自身页面(如后台、弹窗)的CSP规则content_scripts控制注入到目标网页的内容脚本的CSP规则
补充说明
如果顾虑eval的安全风险,也可以将远程脚本转为Blob URL后再通过files参数引用,但实现复杂度更高。对于企业内部场景,上述方法已经足够简洁高效。
内容的提问来源于stack exchange,提问作者Perry
相关产品推荐
相关产品推荐

