【问题标题】:How can we overwrite navigator.getBattery()?我们如何覆盖 navigator.getBattery()?
【发布时间】:2019-02-26 13:39:41
【问题描述】:

我们正在编写一个 chrome 扩展程序,当运行客户端代码的站点出于指纹识别原因检查电池电量时,它会返回随机电池电量。网站可以使用的示例代码如下所示。

navigator.getBattery().then(function(battery) {
    console.log(battery.level);
});

我们找不到有关如何覆盖 navigator.getBattery() 方法以实现目标的文档。不完整的 content-script.js 如下所示。

var navigatorBatteryPrivacy = '(' + function() {
    'use strict';
    var navigator = window.navigator;
    var modifiedNavigator;
    if (Navigator.prototype) {


        modifiedNavigator = Navigator.prototype;

    } else {

        modifiedNavigator = Object.create(navigator);
        Object.defineProperty(window, 'navigator', {
            value: modifiedNavigator,
            configurable: false,
            enumerable: false,
            writable: false
        });
    }


    modifiedNavigator.getBattery = function modifiedGetBattery() {
        return Promise.resolve(new BatteryManager());
    };




} + ')();';

var s = document.createElement('script');
s.textContent = navigatorBatteryPrivacy;
document.documentElement.appendChild(s);
s.remove();

我们感谢社区成员的合作。

【问题讨论】:

  • 这是一个只读属性,我不认为你可以覆盖/欺骗那些
  • @LucaKiebel 我刚刚在我的 Chrome 控制台中重写了它。
  • 还要确保在document_start 运行您的内容脚本。

标签: javascript google-chrome-extension navigator batterylevel


【解决方案1】:

使用在 document_start 注入脚本的内容脚本,代码如下 -

Object.defineProperty(navigator, "getBattery", {
    value: () => {/*your custom logic goes here*/}
});

将以下内容添加到清单 json。

"content_scripts": [{
    "run_at": "document_start",
    "js": ["contentscript.js"]
}]

【讨论】:

    【解决方案2】:

    您可以简单地替换navigator.getBattery,而不是创建新的navigator 对象。

    var navigatorBatteryPrivacy = "(" + function() {
        navigator.getBattery = function modifiedGetBattery() {
            return Promise.resolve(new BatteryManager());
        };
    } + ")();";
    

    【讨论】:

      【解决方案3】:

      需要在页面上执行其他脚本之前运行

      var p = Object.create(BatteryManager).prototype;
      Object.defineProperty(p,'level',{enumerable: true, configurable: true, get: ()=> 0.34});
      Object.defineProperty(p,'charging',{get: ()=> true});
      Object.defineProperty(p,'chargingTime',{get: ()=> Infinity});
      Object.defineProperty(p,'dischargingTime',{get: ()=> Infinity});
      
      Object.defineProperty(p,'onchargingchange',{get: ()=> null});
      Object.defineProperty(p,'onchargingtimechange',{get: ()=> null});
      Object.defineProperty(p,'ondischargingtimechange',{get: ()=> null});
      Object.defineProperty(p,'onlevelchange',{get: ()=> null});
      Object.defineProperty(navigator, "getBattery", {
         value: () => { return Promise.resolve(p)
         }
      });
      

      【讨论】:

        猜你喜欢
        • 2021-01-03
        • 2020-11-26
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 1970-01-01
        • 2016-03-06
        相关资源
        最近更新 更多