5 javascript google-chrome v8 google-chrome-extension ecmascript-2016
据我了解,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绑定到我的代理函数,则会发生错误,因此他可以检测到我的函数实际上是代理。因此,我尝试代理Function和Function.prototype,Function.prototype.toString但后来我意识到我无法代理Function,因为即使我覆盖全局属性Function,有人也可以使用 来访问它(a=>a).constructor。
所以,这就是我在这里问这个问题的原因,因为我没有想法了。如何代理一个函数以使其完全无法检测到?在 ES 规范中,它明确指出“代理是不可检测的”,所以作为一个附带问题,为什么代理函数是可检测的?
我试图实现这一目标的原因是因为我正在为 Chrome 开发增强型广告拦截扩展。我正在处理非常激进的网站,该网站利用大量 JavaScript 技巧来检测我是否正在查看广告。所以,基本上,我删除了一个广告,然后他们的脚本检查是否有特定元素,如果没有,那么我无法访问该网站。因此,我尝试代理document.getElementById,但他们检查它是否已代理,如果是,我将无法访问该网站,因此我必须使其无法检测到。
我认为您尝试用代理做的事情是不可能的。规范明确定义了抛出行为。由于无法提供“内部插槽”,因此在.Function.prototype.toStringTypeErrorProxy[[ECMAScriptCode]]Proxy
我在规范中也没有看到任何“代理无法检测到”的声明;字符串“可检测”不会出现在文档中的任何位置。您在哪里找到这个说法?
也许您可以覆盖函数(及其.toString属性)来实现您的目标?大致:
var original_getElementById = document.getElementById;
document.getElementById = function(id) {
if (...) {
return original_getElementById(id);
} else {
// special handling here
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
943 次 |
| 最近记录: |