fix(stealth): webdriver = false (not undefined) — never delete the property
The webdriver patch deleted navigator.webdriver, leaving it `undefined`. Real Chrome reports `false`, so `undefined` is itself a detection tell, and deleting it also removes the native `false` that Emulation.setAutomationOverride sets. Now we rely on setAutomationOverride for a native (undetectable) `false` and only force `false` via a getter as a fallback when webdriver is still `true` (older Chrome without that override) — never delete it. Verified: FullLaunch headless now reports navigator.webdriver === false (boolean), consistently.
This commit is contained in:
@@ -1,14 +1,29 @@
|
|||||||
const __abStealth = { locale: "en-US", languages: ["en-US", "en"], allowWebGLContextFallback: false };
|
const __abStealth = { locale: "en-US", languages: ["en-US", "en"], allowWebGLContextFallback: false };
|
||||||
(function(){
|
(function(){
|
||||||
const removeWebdriver = (target) => {
|
// Prefer the CDP-level automation override (Emulation.setAutomationOverride),
|
||||||
|
// which makes navigator.webdriver report `false` NATIVELY — undetectable by
|
||||||
|
// lie-detection (creepjs). Only intervene when webdriver is still truthy
|
||||||
|
// (e.g. older Chrome without that override) and force it to FALSE.
|
||||||
|
//
|
||||||
|
// Never `delete` webdriver: real Chrome reports `false`, so `undefined` is
|
||||||
|
// itself a tell, and deleting it removes the native `false` the override set.
|
||||||
|
const forceWebdriverFalse = (target) => {
|
||||||
if (!target) return;
|
if (!target) return;
|
||||||
try { delete target.webdriver; } catch {}
|
try {
|
||||||
|
if (target.webdriver === true) {
|
||||||
|
Object.defineProperty(target, 'webdriver', {
|
||||||
|
get: () => false,
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch {}
|
||||||
};
|
};
|
||||||
removeWebdriver(navigator);
|
forceWebdriverFalse(navigator);
|
||||||
removeWebdriver(Object.getPrototypeOf(navigator));
|
forceWebdriverFalse(Object.getPrototypeOf(navigator));
|
||||||
removeWebdriver(Navigator.prototype);
|
forceWebdriverFalse(Navigator.prototype);
|
||||||
if (typeof WorkerNavigator !== 'undefined') {
|
if (typeof WorkerNavigator !== 'undefined') {
|
||||||
removeWebdriver(WorkerNavigator.prototype);
|
forceWebdriverFalse(WorkerNavigator.prototype);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
(function(){
|
(function(){
|
||||||
|
|||||||
Reference in New Issue
Block a user