1

我正在开发一个 chrome 扩展来修改来自 Web 服务的 U2F 创建请求参数。是否可以通过 Chrome 扩展替换navigator.credentials.create请求或响应参数?我找不到与此相关的资源。任何指针都会有所帮助。

特别是,当用户为网站注册 U2F 时,它会调用浏览器 Web API navigator.credentials.create,后者又会联系硬件令牌并返回响应。我想修改navigator.credentials.create网页调用的 API 的请求和响应。

4

1 回答 1

1

没有办法通过 Chrome API 实现您想要的。Chrome 不提供任何类型的 API 来“即时”修改请求或其他类型的数据,就像您想要做的那样。我只能假设这很可能是一种安全措施。

但是,由于您说要修改navigaror.credentials.create()在某个特定网站上传递和返回的数据,您可以使用内容脚本轻松完成此操作,该脚本将函数替换为自定义处理程序并充当代理,拦截所有调用和可能会修改数据。

这是否有意义取决于您在拦截这些调用时具体要做什么。重要的是要提到@gcochard在评论中让我们注意到:

U2F/WebAuthN 的全部意义在于为网络上的强身份验证制定加密安全的质询/响应方案。插入代理并更改请求和响应将在您不是 MITM 的任何上下文中破坏该加密质询/响应,从而使您的用户依赖于您的扩展来进行身份验证。这可能有助于解释您要如何处理这些数据。

无论哪种方式,您仍然可以记录和访问数据,因此该策略可能会有有意义的应用。

我只会概述内容脚本应该做什么,如果您也不知道如何在页面中注入内容脚本,请参阅此文档页面。在任何情况下,您都希望您的脚本尽快运行因此请确保拥有"run_at": "document_start".

内容脚本将执行以下操作:

  1. 在页面内创建一个<script>标签,在其中加载一些代码,这将:
  2. create()将它的方法保存navigator.credentials在另一个变量中。
  3. 将原始create()方法替换为“过滤”对其进行的调用并在内部调用真实方法的函数。

因此,这是一个实现您目标的简单内容脚本:

const code = `
    const real_create = navigator.credentials.create.bind(navigator.credentials);

    navigator.credentials.create = function() {
        // Modify the arguments how you want.
        console.log(arguments);

        // Call the real method with the modified arguments.
        let res = real_create.apply(arguments);

        // Modify the return value how you want, then return it.
        console.log(res);
        return res;
    }
`;

const script = document.createElement('script');
script.textContent = code;
(document.documentHead || document.documentElement).appendChild(script);
script.remove();

以上应该完全符合您的要求,只需将其注入正确的页面即可。

注意:code变量是使用模板字符串文字创建的,由 characters 分隔`,如果您不想使用模板文字,您可以使用字符串数组然后加入它。您还可以参考此答案,其中列出了将代码从内容脚本注入页面的其他方法。

于 2020-02-12T14:00:20.300 回答