簡體   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