Google chrome extension 使用chrome扩展在mail.google.com上进行脚本注入

Google chrome extension 使用chrome扩展在mail.google.com上进行脚本注入,google-chrome-extension,content-script,Google Chrome Extension,Content Script,我正在开发一个chrome扩展,在这个扩展中,我用一个自定义处理程序替换chrome的web API函数navigator.credentials.createnavigator.credentials.create 自定义处理程序在facebook.com上运行,但在mail.google.com上不运行 我已经附加了我正在处理的扩展的最小代码。该脚本在每个页面上都被注入,可以通过控制台“注入脚本”进行确认。在我的示例应用程序中,我在navigator.credentials.create的自

我正在开发一个chrome扩展,在这个扩展中,我用一个自定义处理程序替换chrome的web API函数
navigator.credentials.create
<当用户为安全密钥启动2FA注册时,将调用code>navigator.credentials.create

自定义处理程序在facebook.com上运行,但在mail.google.com上不运行

我已经附加了我正在处理的扩展的最小代码。该脚本在每个页面上都被注入,可以通过控制台“注入脚本”进行确认。在我的示例应用程序中,我在
navigator.credentials.create
的自定义处理程序中打印了一条控制台语句“In extension's create”。当用户启动2FA注册过程时,应打印此信息。它在facebook上工作,但在facebook上不起作用。我已验证脚本已插入网站上所有可用的iFrame中。我还确认mail.google.com没有使用服务人员调用
navigator.credentials.create
API

content_script.js

const webauthnInject = document.createElement('script');
webauthnInject.type = 'text/javascript';
webauthnInject.src = 'chrome-extension://' + chrome.runtime.id + '/inject_webauthn.js';
document.documentElement.appendChild(webauthnInject);
注入\u webauthn.js

(() => {

    console.log("injected script");

    const real_create = navigator.credentials.create;
    navigator.credentials.create = async function() {
        console.log("In extension's create");
        let res = await real_create.bind(navigator.credentials)(arguments[0]);
        return res;
    };

})();
manifest.json

{
  "manifest_version": 2,
  "name": "sample app",
  "description": "A Sample app",
  "version": "1.0.2",
  "minimum_chrome_version": "36.0.1985.18",
  "content_scripts": [
    {
      "all_frames": true,
      "match_about_blank": true,
      "matches": [
        "https://*/*",
        "http://*/*"
      ],
      "exclude_matches": [
        "https://*/*.xml"
      ],
      "run_at": "document_start",
      "js": [
        "content_script.js"
      ]
    }
  ],
  "background": {
    "persistent": false,
    "scripts": [
      "background.js"
    ]
  },
  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",

  "permissions": [
    "tabs",
    "storage",
    "https://*/*",
    "http://*/*"
  ],
  "web_accessible_resources": [
    "inject_webauthn.js"
  ]
}

上次我们讨论这个问题时,猜测是站点正在使用一个空的iframe来提取本机API。为了防止出现这种情况,您需要覆盖中的document.createElement并以某种方式欺骗它。@wOxxOm不应该
“所有\u帧”:true
“匹配\u关于\u blank”:true
甚至在空帧中插入内容\u脚本?创建新iframe时是否覆盖document.createElement并插入脚本?有点不清楚。你能详细说明一下,如果
match\u about\u blank
不是正确的方法吗?Chrome不会注入不需要网络加载器的iFrame,即带有空
src
srcdoc
src=“javascript:…”
等的iFrame。重写createElement应该在创建这样一个iframe的文档中执行。我不知道是哪一个。