Aller au contenu

Réglages recommandés — ce qu’il faut activer, et ce qu’il vaut mieux laisser tel quel

La plupart des blocages que nous avons pu imputer à une configuration venaient du fait de spoofer plus, pas moins. Cette page résume ce que nous avons mesuré : les réglages qui valent la peine d’être utilisés, ceux qui vous coûtent plus qu’ils ne vous rapportent, et la poignée de problèmes qu’aucun réglage ne peut résoudre.

Commencez ici

Si vous ne deviez lire qu’une chose sur cette page, ce serait cette configuration de départ. Elle fait varier les axes qu’on peut faire varier sans risque et laisse tels quels le rendu, TLS et la version du navigateur.

javascript
import { launch } from "clearcote";

const browser = await launch({
  lightStealth: true,        // metadata identity only — rendering, TLS and version stay real
  fingerprint: "account-42", // picks this identity's metadata bundle; keep it stable per identity
  proxy: { server: "http://gateway:8080", username: "u", password: "p" },
  geoip: true,               // timezone + languages + the address WebRTC reports follow the proxy exit
  humanize: true,            // trusted native input; navigator.webdriver stays false
});

En Python, c’est la même API en snake_case : light_stealth, fingerprint, geoip, humanize. Ajoutez des axes délibérément, un par un, et seulement quand vous savez dire ce qui, sur l’hôte, viendra les corroborer. Plusieurs lignes ci-dessous — les contrôles fins de la r12, le mode humanize à mouvements enregistrés, socks5Udp, les options de cookies tiers et de proxy — s’appliquent au build sous licence (Gratuit avec GitHub ou Pro). Le build ouvert les ignore : humanize se rabat sur des trajectoires générées, et un proxy SOCKS5 protégé par mot de passe refuse la connexion.

Le principe : un spoof est une affirmation que l’hôte doit pouvoir étayer

La détection ne cherche pas des valeurs inhabituelles. Elle cherche des contradictions — deux signaux qui ne peuvent pas être vrais tous les deux pour une même machine. Une valeur ordinaire que personne n’a spoofée ne contredit rien. Une valeur spoofée sans rien derrière est un signal positif, et un signal plus fort que la valeur qu’elle masquait.

Avant d’activer une option, la question utile n’est donc pas « cette valeur est-elle plausible ? » mais « qu’est-ce qui, sur cette machine, peut être sollicité pour la corroborer, et la réponse concordera-t-elle ? » Les dimensions d’écran sont confrontées à la surface de rendu. Une chaîne GPU est confrontée aux pixels que produit le GPU. Un système d’exploitation annoncé est confronté aux polices que la plateforme résout. Si l’hôte ne peut pas étayer l’affirmation, la valeur honnête est la plus sûre. Voir Comment fonctionne la détection pour les mécanismes en jeu.

À faire

RéglagePourquoi
lightStealth: trueApplique un ensemble cohérent, dérivé du seed, qui porte uniquement sur les axes de métadonnées — hardwareConcurrency, deviceMemory, colorDepth, devicePixelRatio, maxTouchPoints — via des switches natifs à valeur unique. La sortie canvas, WebGL et audio, TLS et la vraie version du navigateur restent tels quels. Le seed se contente de choisir, parmi un petit ensemble de bundles, celui qu’obtient une identité, et il n’y a pas de bruit de rendu : les comptes d’une même machine partagent donc leur hash canvas. Sur un écran mis à l’échelle ou inhabituel, comparez la densité de pixels choisie par le bundle à celle de votre écran, sur l’audit.
Un seed fingerprint stable par identitéMême seed ⇒ même identité. Réutilisez-le pendant toute la vie du compte. Changer de seed à chaque requête fait arriver un même compte connecté depuis une nouvelle machine à chaque fois, ce qui est un signal bien plus criant que n’importe laquelle des valeurs que l’on fait tourner. Pour plusieurs comptes sur une même machine qui ne doivent pas partager un canvas, utilisez la persona dérivée du seed (retirez lightStealth) pour que chaque compte ait son propre bruit de rendu.
geoip: true à chaque lancementLe fuseau horaire, les langues et l’adresse que rapporte WebRTC suivent l’IP de sortie — avec ou sans proxy (ou définissez vous-même timezone et acceptLanguage). Sans l’un ni l’autre, le SDK suppose New York et en-US. Une sortie résidentielle américaine qui annonce Europe/Amsterdam se vérifie en une ligne, et c’est une incohérence facile à commettre par accident. Si la région ne peut pas être déterminée, le lancement s’arrête avec GeoipError au lieu de démarrer sur l’horloge de cette machine — corrigez le proxy ou augmentez CLEARCOTE_GEOIP_TIMEOUT_SECONDS.
humanize: trueLes saisies sont générées sous forme d’événements natifs de confiance (trusted), le long de trajectoires de curseur d’allure humaine (mouvements humains enregistrés pour les clics par coordonnées sur Pro, trajectoires générées sinon). N’ajoutez pas votre propre easing pas à pas par-dessus — définissez des points de passage et laissez humanize interpoler ; un easing fait maison produit des statistiques de mouvement que des saisies standard ne produisent jamais.
widevine: true sous une marque ChromeLa persona par défaut se présente comme Google Chrome, qui répond à la requête DRM Widevine. Sans le CDM, la requête est refusée, ce que n’importe quelle page peut lire. Voir Widevine & DRM.
allowThirdPartyCookies: true si une connexion ou un challenge intégré ne fonctionne plusLa base dégooglisée bloque les cookies tiers, que Chrome d’origine autorise. Les frames intégrées de connexion, de paiement et de challenge qui en dépendent échouent alors d’une manière qu’un navigateur normal ne connaîtrait pas (build sous licence, 152 r22+).
Un contexte persistant par identitéLes cookies, le stockage des sites et le cache font partie de l’identité. Une machine qui découvre le site pour la première fois, à chaque visite, forme un pattern à elle seule.
Mode headful sous Xvfb dans les conteneursUn Chrome en mode fenêtré évite d’emblée les indices propres au mode headless. L’image officielle fonctionne ainsi par défaut.
Tourner sur l’OS que vous comptez annoncerLes mots-clés de polices système CSS2 sont résolus par la plateforme sous le navigateur, et non par quoi que ce soit que contrôlent la page ou le user agent : ils résistent donc à un changement de user agent. Si ce n’est pas possible, gardez intact le bundle de polices Linux — voir plus bas.
tlsProfile laissé sur match-personaLe ClientHello suit la version de Chrome annoncée par la persona : la couche réseau et l’UA concordent. La valeur par défaut est déjà la bonne ; si l’existence de l’option mérite d’être connue, c’est pour éviter de la figer sur une valeur en désaccord avec la version de marque que vous annoncez.

À éviter

Chacun de ces points correspond à un problème que nous avons mesuré, pas à une mise en garde générale.

À éviterCe qui ne va pas
Spoofer screen / avail* sur un hôte dont l’écran ne correspond pasUne taille d’écran falsifiée qu’on ne peut pas réconcilier avec la vraie fenêtre et la surface de rendu déclenche de façon fiable un blocage sur les systèmes anti-bot les plus stricts. C’est précisément pour cela que les dimensions d’écran ne font pas partie de lightStealth et doivent être activées explicitement. Si vous les définissez, définissez tout l’ensemble cohérent — screenWidth, screenHeight, availWidth, availHeight — et laissez un espace plausible pour la barre des tâches plutôt que de rendre avail égal à screen. En headless, le SDK choisit déjà un écran plausible pour vous.
Annoncer un GPU sur un hôte qui fait le rendu en logicielDans un conteneur, ou sur une VM cloud qui rastérise via WARP, SwiftShader ou llvmpipe, une persona qui annonce un GPU de PC de bureau décrit un silicium incapable de produire les pixels que la page peut relire. À partir du build sous licence 150 r12 (le build ouvert l’ignore), gpuStringSpoof: false rapporte le vrai vendor et le vrai renderer WebGL de l’hôte sans toucher au reste — souvent le meilleur compromis sur ce matériel. Attention toutefois : WebGPU suit toujours l’option plus large disableGpuFingerprint, si bien qu’avec ce seul switch fin, navigator.gpu continue de décrire la persona tandis que WebGL rapporte le vrai périphérique.
Recourir à disableGpuFingerprint ou à fingerprintNoise: false pour changer une seule choseLes deux regroupent plusieurs réglages. disableGpuFingerprint modifie les chaînes et la table des paramètres et le farbling de readPixels et la suppression des champs de la persona ; fingerprintNoise: false désactive d’un coup le bruit canvas 2D et le bruit WebGL. Depuis le build sous licence 150 r12, des contrôles fins existent : gpuStringSpoof: false pour les chaînes seules et canvasNoise: false pour le canvas 2D seul. Ces deux contrôles fins ont un coût qu’il vaut mieux connaître : gpuStringSpoof: false modifie les chaînes WebGL mais pas navigator.gpu, si bien que WebGL et WebGPU finissent par nommer des vendors différents sur la même page — le score est bon, la lecture est mauvaise. Et canvasNoise: false combiné à un seed supprime entièrement le canvas propre à chaque compte. Préférez l’option large disableGpuFingerprint, qui modifie WebGL et WebGPU ensemble.
Changer d’identité en cours de sessionChanger le seed, la sortie du proxy ou le fuseau horaire pendant qu’une session est active contredit la session telle qu’elle se présentait jusque-là. Faites tourner les identités entre elles, jamais les valeurs à l’intérieur de l’une d’elles.
Une persona Windows sous Linux dont on a retiré le bundle de policesLa version Linux embarque des clones métriquement compatibles (Segoe UI→Selawik, Arial→Arimo, Times New Roman→Tinos, …) et le SDK les branche via FONTCONFIG_FILE au lancement. Retirez-les, ou construisez une image personnalisée qui supprime <binDir>/fonts/, et les familles Windows annoncées par la persona retombent toutes sur une même police par défaut. Cela se voit sans aucune donnée de référence : deux polices que Windows fournit comme distinctes ont exactement les mêmes mesures.
Empiler un plugin stealth JS par-dessusLes contrôles de Clearcote sont compilés dans le moteur. Ajouter par-dessus un shim au niveau du script réintroduit précisément la couche qui se trahit elle-même, celle que l’approche moteur existe pour supprimer — un getter surchargé se convertit en chaîne sous la forme de son propre code source, et un seul toString() suffit à le lire.
Une persona mobile sur un moteur desktop, sans précautionsplatform: "android" modifie l’UA, le tactile, le type de pointeur, l’écran et le viewport, mais les pixels viennent toujours du GPU desktop (sous un nom de GPU mobile) et la géométrie fine de la page reste celle d’un desktop. C’est une persona en best effort ; considérez la surface de rendu comme la partie qu’il vous reste à résoudre.

Proxys

Le proxy pèse généralement plus sur le résultat que n’importe quel flag du navigateur, et c’est lui qu’on laisse le plus souvent sur un réglage par défaut.

  • Des sorties sticky. Une IP de sortie par identité, conservée pendant toute la session. Une session dont l’IP change en plein parcours se contredit elle-même, quelle que soit la qualité de l’empreinte.
  • Alignez la géographie sur la persona, puis laissez geoip: true en déduire le fuseau horaire et les langues plutôt que de les définir à la main.
  • Les proxys authentifiés sont gérés par le moteur. C’est le navigateur lui-même qui répond aux demandes de mot de passe des proxys HTTP(S) (build sous licence 151 r19+, SDK Python & Node) : le cache des pages reste actif et les requêtes ne portent pas la marque d’une interception. Le SOCKS5 avec mot de passe fonctionne directement sur le build sous licence — passez le nom d’utilisateur et le mot de passe dans des champs séparés. transparentProxy: true (152 r22+) masque le proxy dans les en-têtes de requête et le timing des connexions.
  • Comprenez le compromis WebRTC. Chromium n’envoie jamais de média via un proxy HTTP ou SOCKS : sans autre mesure, le trafic pair-à-pair sortirait donc par votre vraie connexion, où un relais peut lire votre véritable adresse. Le SDK bloque par conséquent l’UDP WebRTC qui ne passerait pas par le proxy. Sur le build ouvert, geoip / webrtcIp lève ce blocage ; le build sous licence le conserve. Associez-le à geoip: true (ou webrtcIp) pour que la page voie toujours les candidats que produit un vrai Chrome, avec l’adresse du proxy ; sans cela, WebRTC ne collecte rien, ce qui se lit comme un blocage. Pour des connexions pair-à-pair fonctionnelles via un proxy SOCKS5, définissez socks5Udp: true (build sous licence ; votre fournisseur doit autoriser le relais UDP), ou utilisez un tunnel complet (WireGuard/OpenVPN) sans proxy dans le navigateur et passez votre propre --webrtc-ip-handling-policy dans args. Sinon, gardez la politique de blocage par défaut.

Ce qu’aucun réglage ne peut corriger

Certaines des surfaces les plus lues dépendent de la machine que vous louez, pas du navigateur que vous y faites tourner.

SurfaceCe que l’hôte détermine
RenduUn hôte sans GPU rastérise en logiciel. Tout produit de cette catégorie en est réduit soit à annoncer un matériel incapable de produire ce rendu, soit à laisser voir le rastériseur logiciel. Si les pixels rendus comptent pour votre cible, la solution est un hôte avec GPU — ou le canvas bridge, qui transfère le travail à un tel hôte.
PolicesUne liste de polices est limitée par ce que l’hôte sait réellement dessiner — depuis le build sous licence 150 r12, la liste canonique est dérivée de trois mille machines réelles et reste croisée avec l’hôte, si bien qu’on ne signale jamais à une page une police qui ne peut pas être rendue. Sous Linux, le SDK utilise le bundle de polices livré avec le navigateur et ignore les polices installées sur l’hôte : installer des paquets dans votre image ne change donc pas ce que voient les pages. Le bundle du build ouvert ne contient aucune police CJK : le texte chinois, japonais et coréen s’y affiche avec des glyphes manquants ; le bundle du build sous licence les inclut. Sous Windows, ce sont les polices de l’hôte lui-même qui sont utilisées. Les sosies Windows du bundle rendent les largeurs plausibles, mais une page peut aussi charger une police par son nom avec local(), et un sosie ne porte pas le vrai nom : mesurées avec une persona Windows sous Linux, Segoe UI et Georgia apparaissaient comme installées mais ne pouvaient pas être chargées.
Rastérisation du texteChaque glyphe est dimensionné par le rastériseur de polices du système d’exploitation : DirectWrite sous Windows, FreeType sous Linux. Aucun réglage n’y a accès. Faire varier une taille de police par pas de 0,01 px modifie la largeur du texte à 99 % des pas sous Windows et à 66 % sous Linux, et un hôte Linux qui se présente comme Windows donne toujours 66 %. Si une page examine votre texte de près, faites tourner le navigateur sur le système d’exploitation que vous annoncez. Voir la pile de polices sous le user agent.

Vérifiez plutôt que de supposer

Chaque affirmation de cette page est mesurable depuis le navigateur. Ouvrez l’audit avec votre session configurée et lisez les lignes où il signale un désaccord — c’est le même outillage que celui qui nous a servi à trouver les problèmes décrits plus haut, et il vous dira lesquelles de ces recommandations votre configuration enfreint actuellement.