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

Chrome扩展Manifest V3迁移:eval()函数报错替代方案咨询

Chrome扩展Manifest V3的默认内容安全策略(CSP)禁止了unsafe-eval权限,因此eval()、new Function()等动态执行字符串代码的API在主扩展上下文都会触发报错,以下是2种合规的替代方案:

方案1:固化动态逻辑到扩展本地(最优推荐)

如果从数据库读取的代码逻辑是固定可枚举的,不要直接存储代码字符串到数据库,仅存储对应逻辑的唯一标识,在扩展本地提前写好所有逻辑的实现函数,读取到标识后直接调用对应本地函数即可,完全不需要动态执行代码,100%符合CSP要求。
以你当前的代码为例,逻辑为「定时获取患者信息写入sessionStorage+重写setInterval记录活跃定时器ID」,可以直接把这段逻辑写到扩展本地的JS文件中,数据库仅存储enable_patient_info_timer这类标识,读取到标识后执行对应本地函数即可。

方案2:使用扩展沙箱页面执行动态代码(适配必须动态执行的场景)

如果业务逻辑确实需要动态执行外部传入的代码,可以使用Manifest V3提供的沙箱能力,沙箱页面的CSP允许单独配置unsafe-eval权限,且和扩展主上下文隔离,不会带来安全风险,操作步骤如下:

  1. 在manifest.json中声明沙箱页面:
{
  "manifest_version": 3,
  // 其余扩展配置保持不变
  "sandbox": {
    "pages": ["sandbox.html"]
  }
}
  1. 新建沙箱页面sandbox.html,如果动态代码依赖jQuery等第三方库,可在该页面提前引入:
<!DOCTYPE html>
<html>
<body>
  <!-- 按需引入动态代码依赖的库,比如jQuery -->
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
  <script src="sandbox.js"></script>
</body>
</html>
  1. 新建沙箱逻辑文件sandbox.js,负责接收代码、执行并返回结果:
window.addEventListener('message', (event) => {
  // 仅接收扩展父页面传来的消息
  if (event.source !== window.parent) return;
  if (event.data.type === 'run_dynamic_code') {
    try {
      // 沙箱环境允许使用eval,不会触发CSP报错
      const execResult = eval(event.data.code);
      window.parent.postMessage({
        type: 'exec_success',
        data: execResult
      }, '*');
    } catch (err) {
      window.parent.postMessage({
        type: 'exec_error',
        msg: err.message
      }, '*');
    }
  }
});
  1. 改造原有FirstFunction,改为调用沙箱执行代码:
var FirstFunction = async function (data) {
  // 创建隐藏的iframe加载沙箱页面
  const sandboxIframe = document.createElement('iframe');
  sandboxIframe.src = chrome.runtime.getURL('sandbox.html');
  sandboxIframe.style.display = 'none';
  document.body.appendChild(sandboxIframe);

  // 等待沙箱加载完成
  await new Promise(resolve => sandboxIframe.onload = resolve);

  // 发送待执行代码到沙箱
  sandboxIframe.contentWindow.postMessage({
    type: 'run_dynamic_code',
    code: data
  }, '*');

  // 监听沙箱执行结果
  function handleExecResult(event) {
    if (event.source === sandboxIframe.contentWindow) {
      if (event.data.type === 'exec_success') {
        console.log('动态代码执行成功', event.data.data);
        // 执行完成后清理资源
        document.body.removeChild(sandboxIframe);
        window.removeEventListener('message', handleExecResult);
      } else if (event.data.type === 'exec_error') {
        console.error('动态代码执行失败', event.data.msg);
        document.body.removeChild(sandboxIframe);
        window.removeEventListener('message', handleExecResult);
      }
    }
  }
  window.addEventListener('message', handleExecResult);
}

注意:沙箱上下文和扩展主上下文完全隔离,无法直接调用扩展API、操作主页面DOM,需要操作的内容可以通过postMessage传递回主上下文后再执行。Manifest V3禁止在扩展主上下文的CSP中添加unsafe-eval,所有修改主CSP放开eval权限的操作都不会生效。

内容的提问来源于stack exchange,提问作者user3804061

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:00:04