[英]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
綁定到我的代理函數,則將發生錯誤,因此他可以檢測到我的函數實際上是代理。 因此,我嘗試代理Function
和Function.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.