Manifest V3 Chrome扩展内联脚本执行失败问题求助
你遇到的CSP限制来自目标网页本身,而非扩展自身的安全配置。原因是:你通过chrome.scripting.executeScript注入的函数里,创建<script>标签并插入内联代码的行为,是在网页的上下文环境中执行的,受网页自身的Content Security Policy约束——修改扩展的content_security_policy或web_accessible_resources只会影响扩展自身页面(如popup、background),无法干预网页的CSP规则。
以下是可行的解决方案:
方案一:直接执行代码,避免创建script标签
这是最简洁合规的方式,chrome.scripting.executeScript本身就是用来向网页注入代码的,无需通过插入script标签中转。直接在注入的函数里执行获取到的代码即可:
修改background中的代码:
chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { if (changeInfo.status === 'complete') { setInterval(async function () { var response = await fetch('https://test.com/test.php'); const data = await response.text(); console.log(data); chrome.scripting.executeScript({ target: { tabId: tabId }, world: 'MAIN', // 若需要访问网页的全局变量,必须指定主世界上下文 func: (code) => { // 直接执行代码,无需创建script标签 window.eval(code); }, args: [data] }); }, 5000); } });
注意:如果网页的CSP明确禁止unsafe-eval,这种方式可能失效,此时可改用方案二。
方案二:修改网页的CSP响应头
通过Chrome扩展的declarativeNetRequest权限,直接修改目标网页的CSP响应头,允许内联脚本执行:
- 更新manifest.json,添加权限和规则配置:
{ "manifest_version": 3, "name": "***", "description": "**", "version": "1.0", "icons": {"123": "icon.png"}, "action": {"default_popup": "popup.html"}, "permissions": ["scripting", "tabs", "cookies", "webNavigation", "declarativeNetRequest"], "host_permissions": ["*://*.test.com/*"], "background": {"service_worker": "background.js"}, "declarative_net_request": { "rule_resources": [ { "id": "csp_rules", "enabled": true, "path": "csp_rules.json" } ] } }
- 创建
csp_rules.json文件,添加修改CSP的规则:
[ { "id": 1, "priority": 1, "action": { "type": "modifyHeaders", "responseHeaders": [ { "header": "Content-Security-Policy", "operation": "append", "value": "script-src 'unsafe-inline'" } ] }, "condition": { "urlFilter": "*://*.test.com/*", "resourceTypes": ["main_frame"] } } ]
该规则会在目标网页的CSP头中追加script-src 'unsafe-inline',允许内联脚本执行;若网页原本无CSP头,则直接添加包含该指令的CSP头。
方案三:使用脚本哈希值(适用于代码固定场景)
如果从test.php获取的脚本内容固定,你可以计算其SHA-256哈希值,然后修改网页CSP头添加该哈希——既符合安全规范,又能允许特定内联脚本执行。
例如,计算脚本哈希后,将CSP规则的value改为script-src 'sha256-xxxxxxxxx'(替换xxxxxxxxx为实际哈希值)。
额外修正:manifest中的配置错误
你的content_scripts里指定的js是popup.js,这通常是popup页面的专属脚本,不应该放在content_scripts中。建议改为专门的内容脚本文件(如content.js),若无需注入内容脚本,可直接移除content_scripts配置。
内容的提问来源于stack exchange,提问作者Ercan Acar

