如何通过 Chrome 扩展替换 navigator.credentials.create 请求或响应参数?
How can I replace navigator.credentials.create request or response parameters through a Chrome extension?
我正在开发 chrome 扩展来修改 U2F 从 Web 服务创建请求参数。是否可以通过 Chrome 扩展替换 navigator.credentials.create
请求或响应参数?
我找不到与此相关的资源。任何指示都会有所帮助。
特别是,当用户为网站注册 U2F 时,它会调用浏览器 web API navigator.credentials.create,后者又会联系硬件令牌和 returns 响应。我想修改网页调用的 navigator.credentials.create
API 的请求和响应。
通过ChromeAPI是无法实现你想要的。 Chrome 不提供任何类型的 API 来修改请求或其他类型的数据 "on the fly",就像您想要的那样。我只能假设这很可能是一项安全措施。
但是,由于您说要修改某些特定网站上由 navigaror.credentials.create()
传递和返回的数据,您可以使用内容脚本轻松地完成此操作,该内容脚本将函数替换为自定义处理程序并充当代理,拦截所有调用并可能修改数据。
这是否有意义取决于您在拦截这些调用时具体要做什么。重要的是要提到 @gcochard 让我们在评论中注意到:
The whole point of U2F/WebAuthN is to make a cryptographically secure challenge/response scheme for strong authentication over the web. Inserting a proxy and changing the request and response will break that cryptographic challenge/response in any context where you're not a MITM, leaving your users dependent upon your extension to authenticate. It might help to explain what you're trying to do with this data.
无论哪种方式,您仍然可以记录和访问数据,因此可能是该策略的有意义的应用。
我只会概述内容脚本应该做什么,如果您还不知道如何在页面中插入内容脚本,请参阅this documentation page。无论如何,您希望您的脚本尽快 运行 ,因此请确保 "run_at": "document_start"
.
内容脚本将执行以下操作:
- 在页面内创建一个
<script>
标签,在其中加载一些代码,这将:
- 将
navigator.credentials
的create()
方法保存在另一个变量中。
- 将原来的
create()
方法替换为 "filters" 对其调用并在内部调用真实方法的函数。
下面是一个可以实现您的目标的简单内容脚本:
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
变量是使用模板字符串文字创建的,由字符 `
分隔,如果您不想使用模板文字,则可以使用字符串数组和然后加入它。您还可以参考 this answer,其中列出了从内容脚本将代码注入页面的其他方法。
我正在开发 chrome 扩展来修改 U2F 从 Web 服务创建请求参数。是否可以通过 Chrome 扩展替换 navigator.credentials.create
请求或响应参数?
我找不到与此相关的资源。任何指示都会有所帮助。
特别是,当用户为网站注册 U2F 时,它会调用浏览器 web API navigator.credentials.create,后者又会联系硬件令牌和 returns 响应。我想修改网页调用的 navigator.credentials.create
API 的请求和响应。
通过ChromeAPI是无法实现你想要的。 Chrome 不提供任何类型的 API 来修改请求或其他类型的数据 "on the fly",就像您想要的那样。我只能假设这很可能是一项安全措施。
但是,由于您说要修改某些特定网站上由 navigaror.credentials.create()
传递和返回的数据,您可以使用内容脚本轻松地完成此操作,该内容脚本将函数替换为自定义处理程序并充当代理,拦截所有调用并可能修改数据。
这是否有意义取决于您在拦截这些调用时具体要做什么。重要的是要提到 @gcochard 让我们在评论中注意到:
The whole point of U2F/WebAuthN is to make a cryptographically secure challenge/response scheme for strong authentication over the web. Inserting a proxy and changing the request and response will break that cryptographic challenge/response in any context where you're not a MITM, leaving your users dependent upon your extension to authenticate. It might help to explain what you're trying to do with this data.
无论哪种方式,您仍然可以记录和访问数据,因此可能是该策略的有意义的应用。
我只会概述内容脚本应该做什么,如果您还不知道如何在页面中插入内容脚本,请参阅this documentation page。无论如何,您希望您的脚本尽快 运行 ,因此请确保 "run_at": "document_start"
.
内容脚本将执行以下操作:
- 在页面内创建一个
<script>
标签,在其中加载一些代码,这将: - 将
navigator.credentials
的create()
方法保存在另一个变量中。 - 将原来的
create()
方法替换为 "filters" 对其调用并在内部调用真实方法的函数。
下面是一个可以实现您的目标的简单内容脚本:
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
变量是使用模板字符串文字创建的,由字符 `
分隔,如果您不想使用模板文字,则可以使用字符串数组和然后加入它。您还可以参考 this answer,其中列出了从内容脚本将代码注入页面的其他方法。