Aller au contenu

Comment fonctionne la détection de bots — et pourquoi Clearcote patche le moteur

L’approche habituelle consiste à patcher navigator.webdriver, à falsifier le vendor WebGL et à surcharger navigator.plugins depuis un script. Les détecteurs la repèrent quand même — et la raison en est structurelle : il ne s’agit pas d’une propriété de plus restée sans couverture.

La cohérence, en image : des signaux indépendants qui se corroborent les uns les autres composent une seule identité. Les deux points isolés — une valeur falsifiée sans rien derrière — sont le raccord qu’une vérification croisée repère.

Une falsification JavaScript se trahit d’elle-même

Une falsification JS, c’est une fonction installée là où devrait se trouver une fonction native. Un détecteur met de côté la valeur renvoyée et cherche à savoir si ce qui la renvoie est natif :

L’indicePourquoi il démasque une falsification JS
toString qui se trahitUne méthode native se convertit en chaîne sous la forme function get vendor() { [native code] } ; une surcharge se convertit en son propre code source — un seul .toString() suffit à la démasquer.
Descripteur / hasOwnPropertygetOwnPropertyDescriptor expose les propriétés redéfinies, et hasOwnProperty('toString') renvoie true sur une fonction modifiée, là où une fonction native renvoie false.
TypeError sur un mauvais thisLes getters natifs lèvent une TypeError bien précise quand le receveur n’est pas le bon ; un shim naïf reste muet, et c’est ce silence qui constitue le signal.
Réacquisition depuis un autre realmUn détecteur récupère un Function.prototype.toString intact dans une nouvelle iframe ou un nouveau Web Worker et l’applique à votre getter — depuis un autre realm que celui de votre patch dans le monde principal. Il renvoie votre code source. Démasqué.

Clearcote n’a aucune couche de ce genre. Le getter de navigator.userAgent est le getter C++ : il affiche [native code] parce qu’il est du code natif, identique dans tous les realms — frame principale, iframe et worker. Il n’y a aucun détournement JavaScript à détecter.

Les trois couches de la détection de bots

Les systèmes anti-bot modernes lisent trois surfaces de nature structurellement différente, à trois endroits distincts. Il est rare qu’un seul outil corrige les trois :

CoucheLes indicesOù se trouve la correctionClearcote
A · driver / binairevariables ChromeDriver cdc_, surface du protocole WebDriverPiloter en CDP brut, sans chromedriver✅ un binaire Chromium standard — aucun artefact de driver
B · effets de bord CDPfuites de Runtime.enable, init-scripts injectés, exécution dans le monde principal, viewport par défaut des outils d’automatisationLa couche de contrôle / client CDP✅ le moteur neutralise la fuite Runtime.enable, le SDK n’injecte aucun script par défaut, et, au lancement, les valeurs par défaut évitent le viewport typique des outils d’automatisation (l’endroit où votre client exécute ses propres scripts ne dépend que de lui)
C · surface d’empreintecanvas, WebGL, audio, polices, navigator, TLS — dans la frame principale, les iframes et les workersLe moteur (C++), parce que les surcharges JS se trahissent d’elles-mêmes✅ c’est ce que fait Clearcote

Ce qui compte le plus : aucun raccord entre le faux et le vrai

Comme les contrôles se trouvent dans le moteur, le JavaScript que voit une page et le handshake réseau sous-jacent proviennent d’un seul et même vrai Chromium. Il n’y a aucun raccord entre un JS falsifié et un vrai TLS qu’une vérification croisée pourrait repérer — précisément le défaut qui trahit les outils à base d’injection. Une seule seed --fingerprint produit une machine unique et cohérente en interne, à travers canvas, WebGL, audio, polices et matériel. Le handshake TLS et HTTP/2 sous-jacent est celui du moteur lui-même, et il concorde parce que la persona annonce la version réelle du moteur — laissez brandVersion non défini pour qu’il en reste ainsi.

Et quand c’est le bruit lui-même qui trahit, désactivez-le — canvas et WebGL renvoient leurs valeurs naturelles tandis que la falsification d’identité reste active (l’audio rendu et les client rects ne sont de toute façon jamais perturbés, et les scalaires de fréquence/latence AudioContext continuent de suivre la persona ; voici pourquoi) :

javascript
await launch({ fingerprint: "u1", fingerprintNoise: false });   // identity on, per-site farbling off

Bruit désactivé, les identités d’une même machine partagent un seul hash canvas. canvasNoise: false ne désactive que le canvas 2D et conserve le bruit WebGL (build sous licence, 150 r12+).

Cohérence du réseau et de la locale

La persona n’est qu’une moitié du problème : le fuseau horaire, la langue et l’adresse WebRTC doivent aussi concorder avec la provenance du trafic. Derrière un proxy, lancez avec geoip — le SDK recherche l’IP de sortie du proxy, définit le fuseau horaire, la liste des langues, la géolocalisation et l’adresse WebRTC de cette région, et interrompt le lancement s’il ne parvient pas à la déterminer. Sans cette option, le fuseau horaire suit la langue (en-US signifie New York), quel que soit le pays du proxy. Consultez Playwright & Puppeteer pour les options.

C’est pourquoi Clearcote patche le moteur C++ au lieu d’injecter du JavaScript. Consultez Flags d’empreinte pour voir ce que vous contrôlez, et Architecture pour comprendre comment le moteur garde tous les signaux cohérents entre eux.