繁体   English   中英

JavaScript-使代理无法检测

[英]JavaScript - Make Proxy undetectable

据我了解,ES规范指出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:

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 ,也有人可以使用(a=>a).constructor访问它(a=>a).constructor

所以,这就是为什么我在这里问这个问题的原因,因为我没办法了。 如何代理功能使其完全无法检测? 在ES规范中,它明确指出“代理是不可检测的” ,因此,作为一个附带的问题,为什么然后代理可检测的功能?

编辑

我之所以要实现这一目标,是因为我正在开发适用于Chrome的增强型广告屏蔽扩展程序。 我正在处理一个非常激进的网站,该网站利用大量的JavaScript技巧来检测我是否正在查看广告。 因此,基本上,我删除了一个广告,然后他们的脚本检查是否存在特定的元素,如果没有,则无法访问该网站。 因此,我尝试代理document.getElementById ,但是他们检查它是否为代理,如果不是,则无法访问该网站,因此必须使其无法检测。

我认为您使用Proxies不可能做到。 Function.prototype.toString规范明确定义了TypeError行为。 由于无法为Proxy提供[[ECMAScriptCode]] “内部插槽”,因此在Proxy上调用时,它将始终抛出。

我也没有在规范中提到任何“ Proxy is notdetectable ”的说法。 字符串“ detectable”不会显示在文档中的任何位置。 您在哪里找到这个要求?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM