相关疑难解决方法(0)

JavaScript - 使代理无法检测

据我了解,ES 规范说Proxy(用于代理对象、函数和类的全局构造函数)是不可检测的。这意味着如果我代理一个函数,使用该代理函数的任何人都无法检测到我使用了代理。然而,显然我误解了它,因为代理功能是可以检测到的。

例如,new Proxy(a=>a,{apply:a=>a})+''抛出错误。它说

Uncaught TypeError: Function.prototype.toString requires that 'this' be a Function
Run Code Online (Sandbox Code Playgroud)

然而,typeof new Proxy(a=>a,{apply:a=>a})确实是"function",但它以某种方式无法对代理进行字符串化。因此,显然,在这种情况下,代理函数的行为与非代理函数的行为不同。Function.prototype.toString能够区分代理函数和非代理函数。

我的目标是代理一个函数,使其变得不可检测。我的第一个想法是像这样真正代理代理:

Proxy.toString = (a => () => a)(Proxy + '');
Proxy = new Proxy(Proxy, {
  construct: (f, args) => {
    if(typeof args[0] == 'function'){
      var a = args[0] + '';
      args[0].toString = () => a;
    }
    return new f(...args);
  }
});
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,这是可以检测到的。如果有人调用Function.prototype.toString绑定到我的代理函数,则会发生错误,因此他可以检测到我的函数实际上是代理。因此,我尝试代理FunctionFunction.prototypeFunction.prototype.toString但后来我意识到我无法代理Function,因为即使我覆盖全局属性Function,有人也可以使用 …

javascript google-chrome v8 google-chrome-extension ecmascript-2016

5
推荐指数
1
解决办法
943
查看次数