【问题标题】:JavaScript - Make Proxy undetectableJavaScript - 使代理无法检测
【发布时间】:2018-01-23 03:27:02
【问题描述】:

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

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

Uncaught TypeError: Function.prototype.toString requires that 'this' be a Function

然而,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);
  }
});

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

所以,这就是我在这里问它的原因,因为我没有想法。如何代理一个函数以使其完全无法检测?在 ES 规范中,它明确表示 “代理不可检测”,所以作为一个附带问题,为什么代理函数是可检测的?

编辑

我试图实现这一目标的原因是因为我正在为 Chrome 开发增强的广告拦截扩展。我正在处理非常激进的网站,该网站利用大量 JavaScript 技巧来检测我是否正在查看广告。所以,基本上,我删除了一个广告,然后他们的脚本检查是否有特定元素,如果没有,那么我无法访问该网站。所以,我尝试代理document.getElementById,但他们检查它是否被代理,如果是,我无法访问该网站,所以我必须让它无法检测。

【问题讨论】:

  • 是不是因为箭头函数不是自己的这个作用域而引发的错误?
  • @SvenvandeScheur。我不知道你问了什么。它与范围无关。一旦一个函数被代理,原来的那个就不再重要了。标准的非箭头函数也会抛出错误。

标签: javascript google-chrome google-chrome-extension v8 ecmascript-2016


【解决方案1】:

我认为您尝试使用代理无法实现。 spec for Function.prototype.toString 清楚地定义了 TypeError-throw 行为。因为没有办法给 Proxy[[ECMAScriptCode]] “内部插槽”,所以在 Proxy 上调用时它总是会抛出。

我也没有看到规范中提到任何“Proxy is undetectable”声明;字符串 'detectable' 不会出现在文档中的任何位置。您在哪里找到此声明?

也许您可以覆盖函数(及其.toString 属性)来实现您的目标?大致:

var original_getElementById = document.getElementById;
document.getElementById = function(id) {
  if (...) {
    return original_getElementById(id);
  } else {
    // special handling here
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多