在 Chrome chrome-extension:// 页面中使用 eval()

Use eval() in a Chrome chrome-extension:// page

我知道这可能只是我的愚蠢,但是在一个 Chrome 选项卡中,该选项卡的页面加载了以 chrome-extension:// 开头的 URL,脚本可以是在线还是使用 eval();?我知道浏览器或页面 actin oopups 或应用 windows 不能使用它。我的扩展程序的一部分会打开一个正常的新标签页,其中包含一个使用 eval();.

的页面

要使用 eval,请查看 https://developer.chrome.com/extensions/contentSecurityPolicy

中的政策 "unsafe-eval"

chrome-extension:// 来源的所有页面 运行 均受 here 描述的默认内容安全策略的约束,特别是:

script-src 'self'; object-src 'self'

弹出窗口也被认为是这样的页面,不可见的背景页面也是如此。如果您从扩展程序中打开文件,它也会受到影响。

您可以:

  • 放宽(或收紧)所有包含清单的页面的默认策略:

    "content_security_policy": "[POLICY STRING GOES HERE]"
    

    这样您就可以通过将 'unsafe-eval' 添加到 script-src 来允许 eval 和朋友。

    您还可以通过将它们的来源添加到策略来允许加载外部脚本;但是,出于 MitM 保护的原因,只允许 HTTPS 来源。

    但是,请务必记住,无论您的自定义策略如何,'unsafe-inline' 都将被忽略。

  • 放宽(或收紧)特定页面的默认策略declaring it sandboxed

    "sandbox": {
      "pages": [
        "page1.html",
        "directory/page2.html"
      ]
      // content_security_policy is optional.
      "content_security_policy":
          "sandbox allow-scripts; script-src https://www.google.com"
    ],
    

    沙盒 CSP 可以更宽松,但仍有一些限制。

    沙盒的价格正在失去 Chrome API。沙盒脚本必须通过 DOM 消息与某些特权页面通信以执行特权操作。

    文档中有指南,"Using eval in Chrome Extensions. Safely."


对于应用程序,情况有点不同。同样,默认(且限制性更强)的 CSP 适用,但 you cannot modify it in the manifest.

不过,沙盒方法仍然有效。