You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Manifest V3 Chrome扩展内联脚本执行失败问题求助

解决Manifest V3中执行内联脚本的CSP错误

你遇到的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响应头,允许内联脚本执行:

  1. 更新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"
      }
    ]
  }
}
  1. 创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:17:54