Retour au Centre de connaissances
Empreinte

Navigateur non détecté : ce qu’un détecteur lit

Suivez ce qu’une page de contrôle échantillonne, pourquoi un navigateur passe chez un fournisseur et échoue chez un autre, et comment consigner des résultats par détecteur.

BotBrowser Team

Documentation

Vous voulez la documentation structurée pour Empreinte ?

Cet article fait partie de la bibliothèque éditoriale. Pour les étapes de configuration, la référence et les mises à jour continues, passez directement à la section docs.

L’expression « navigateur non détecté » est une affirmation sur un verdict, et un verdict appartient à celui qui a lancé le contrôle. Une page de contrôle ne demande pas si un navigateur est honnête ; elle échantillonne un ensemble de surfaces, les compare à un modèle qui lui appartient et renvoie un score dont les lignes de passage et les pondérations sont celles du fournisseur. Deux détecteurs peuvent échantillonner des surfaces différentes de la même session et aboutir à des conclusions opposées sans qu’aucun des deux soit défectueux. BotBrowser prend en charge un environnement Chromium configurable et documente les signaux qu’il peut garder cohérents, et il ne peut pas garantir un verdict de tiers ni publier un taux de réussite, parce qu’un taux est une propriété d’une version de détecteur plus une cible plus une session, pas une propriété d’un navigateur. Ce qu’un détecteur peut lire, pourquoi les lectures divergent et ce qu’il faut consigner à la place d’une affirmation forment le corps de la question.

TL;DR

  • navigator.webdriver est un seul booléen. MDN documente que Chrome le passe à vrai lorsque --enable-automation, --headless ou --remote-debugging-port=0 est utilisé : le drapeau décrit donc la façon dont le navigateur a démarré, pas la confiance qu’une page lui accordera.
  • performance.now() est volontairement dégradé pour protéger contre les attaques temporelles et l’empreinte : MDN documente une résolution de 5 microsecondes dans un document isolé des origines et de 100 microsecondes sinon. Une sonde exécutée à une résolution n’est pas comparable à la même sonde exécutée à l’autre.
  • Un verdict est une fonction du modèle du détecteur. Deux fournisseurs qui échantillonnent des surfaces différentes peuvent diverger sur une même session sans que l’un des deux se trompe sur ce qu’il a mesuré.
  • Remplacez l’affirmation par un relevé : nom et version du détecteur, surfaces rapportées, ligne de passage appliquée, configuration de session et horodatage. Un relevé se compare ; une affirmation non.
  • Le livrable honnête est un tableau de résultats par détecteur avec les modes de défaillance nommés, pas un adjectif dans le nom du produit.

Un schéma de flux montre une session de navigateur échantillonnée par trois détecteurs distincts, chacun lisant un ensemble de surfaces différent et appliquant sa propre ligne de passage, les trois verdicts étant consignés dans un relevé par détecteur plutôt que dans une seule affirmation d’indétectabilité.

Sommaire

Ce qu’une page de contrôle peut échantillonner

Un détecteur lit ce que n’importe quel script d’une page peut lire. C’est toute la surface, et elle vaut la peine d’être listée parce qu’elle est finie et sans éclat.

Drapeaux de navigation et d’automatisation

navigator.webdriver est le membre de ce groupe qu’une page voit en premier, et il ne porte qu’un seul bit à lui seul. MDN le définit comme une propriété en lecture seule indiquant si l’agent utilisateur est contrôlé par l’automatisation, et documente les conditions Chrome précises qui le rendent vrai : le drapeau --enable-automation, le drapeau --headless, ou --remote-debugging-port avec le port 0. Chacune de ces conditions décrit une configuration de lancement. Une page qui lit le booléen apprend comment le processus a démarré, et une page qui ne lit que ce booléen a décidé de faire confiance à un seul bit.

Les signaux voisins décrivent le même lancement sous d’autres angles. La présence d’une liaison propre à l’automatisation sur l’objet window, un port de débogage qui répond en loopback, une chaîne d’agent utilisateur qui nomme une compilation headless, et un objet window.chrome dont la forme diffère d’une installation standard pointent tous vers la même question : ce navigateur a-t-il démarré comme démarre celui d’une personne ? Aucun d’eux ne répond si la session sera acceptée, parce qu’un détecteur peut leur attribuer un poids nul.

La chaîne d’agent utilisateur et les Client Hints donnent des tranches différentes d’une même déclaration. navigator.userAgent renvoie une seule chaîne, tandis que navigator.userAgentData renvoie un tableau brands de paires { brand, version }, un booléen mobile et une chaîne platform. La méthode getHighEntropyValues() accepte une liste de champs, dont architecture, bitness, model, platformVersion et uaFullVersion, et renvoie une promesse avec les valeurs demandées. Un détecteur qui ne lit que brands voit moins qu’un détecteur qui demande uaFullVersion et bitness, ce qui est un autre exemple de deux ensembles de surfaces.

SignalCe qu’il décritPourquoi il est faible seul
navigator.webdriverSi des drapeaux d’automatisation ont été utilisésUn booléen, que des fournisseurs peuvent ignorer
Liaison d’automatisation sur windowQuelle bibliothèque a injecté des scriptsAbsente en lancement direct, présente dans certains frameworks
Port de débogage joignableSi un point d’accès de protocole est ouvertUn port fermé est normal chez une personne
Chaîne d’agent utilisateurCe que le navigateur prétend êtreConfigurable, et une prétention plutôt qu’une mesure
Forme de window.chromeQuelle famille de compilation ChromiumVarie selon la compilation, pas selon la fiabilité

Surfaces de stockage et de permissions

Le stockage est un quatrième groupe, et c’est celui qui change avec l’historique d’un utilisateur plutôt qu’avec la compilation du navigateur. La disponibilité des cookies, le partitionnement éventuel du stockage tiers, la stabilité d’une sonde de quota et le fait qu’une origine ait déjà été visitée décrivent le passé d’une session plutôt que sa configuration. Un détecteur qui les lit demande si ce profil est déjà venu, ce qui est une autre question que celle de savoir si le navigateur est automatisé.

Le quota et l’occupation sont disponibles via navigator.storage.estimate(), qui renvoie une promesse avec quota et usage en octets. L’énumération des bases via indexedDB.databases() renvoie les noms et les versions, et caches.keys() liste les noms de caches. Ces trois appels donnent à un détecteur des informations sur l’état accumulé sans lire aucun contenu : la seule présence d’une base nommée ou d’un cache versionné distingue déjà un profil neuf d’un profil utilisé.

Les permissions se comportent de la même façon. L’ensemble des permissions qu’un document peut interroger, l’état que chacune renvoie et le fait qu’une demande déclenche une invite sont observables sans aucune interaction. La valeur de Notification.permission et le résultat de navigator.permissions.query({ name: 'geolocation' }) en sont deux exemples. Une page peut donc dresser un tableau des décisions de consentement antérieures d’un profil, et un profil neuf et un profil ancien répondent différemment même quand la compilation est identique.

C’est pourquoi une charge de surveillance ou de comparaison doit décider explicitement si elle veut un profil neuf ou un profil persistant, et consigner ce choix. Les deux produisent des réponses différentes sur cette surface, et aucune n’est plus fiable que l’autre : ce sont simplement des sessions différentes.

Surfaces de minutage et de performance

Le minutage est facile à négliger, parce qu’il ressemble à une mesure de la machine plutôt que du navigateur. MDN documente que performance.now() est dégradé exprès : 5 microsecondes de résolution dans un document isolé des origines, 100 microsecondes sinon. C’est un écart d’un facteur vingt sur le plus petit intervalle observable, et c’est une propriété de l’état d’isolation du document, non du matériel.

La conséquence pour une comparaison est directe. Une sonde qui mesure le plus petit delta non nul entre deux appels à performance.now() lit la résolution, pas la machine. Exécutez la même sonde dans un document isolé et dans un document non isolé, et les nombres diffèrent d’un facteur vingt. Un détecteur qui échantillonne le comportement des minuteurs observe donc l’état d’isolation du document dans lequel il tourne, et une équipe qui change cet état entre deux exécutions a changé la mesure.

La propriété crossOriginIsolated est disponible pour la page sous forme de booléen, ce qui permet à un détecteur de classer un document dans l’un des deux groupes de résolution sans mesurer aucun intervalle. Un relevé de session sans ce champ laisse ouvert laquelle des deux valeurs un minuteur pouvait observer.

Une seconde horloge se comporte autrement. Date.now() renvoie des millisecondes entières, donc une sonde construite dessus ne résout pas un intervalle inférieur à une milliseconde et ne montre pas la dégradation de performance.now(). Un rappel requestAnimationFrame arrive à la fréquence de rafraîchissement de l’écran, environ soixante fois par seconde à 60 Hz et environ cent vingt fois par seconde sur un panneau à 120 Hz. Un détecteur qui mélange les trois sources de temps obtient trois planchers de précision différents, et une raison de plus de consigner la configuration du document.

Surfaces réseau et média

RTCPeerConnection expose des informations de candidats locaux à une page qui en crée une, ce qui explique que la collecte de candidats soit un moyen d’inspecter une fuite WebRTC. Le même appel révèle aussi si un chemin de connexion prend en charge le protocole, et une page peut distinguer un chemin bloqué d’un chemin fonctionnel sans jamais terminer un appel. Les périphériques média, le rendu canvas, les paramètres WebGL, les métriques de polices et le traitement audio sont du même genre de surface : chacun est une API légitime dont la sortie dépend de l’environnement, et chacun peut être échantillonné sans que la page demande une permission inhabituelle.

navigator.mediaDevices.enumerateDevices() renvoie une liste de périphériques dont le contenu dépend de la permission : MDN documente que les périphériques autres que ceux par défaut ne sont listés qu’une fois la permission accordée, donc un document qui ne l’a jamais demandée voit les périphériques par défaut et aucun libellé. Le champ kind reste renseigné, ce qui permet à un détecteur de compter des classes de périphériques sans afficher d’invite ; deviceId, label et groupId reviennent en chaînes vides tant que la capture n’est pas accordée. La sortie canvas dépend du pilote, du réglage d’anticrénelage et des polices installées, WebGLRenderingContext.getParameter() nomme le fournisseur et le modèle du moteur de rendu, et un AudioContext rapporte son sampleRate, tandis qu’un DynamicsCompressorNode expose ratio, knee, attack et release. Les lectures canvas, WebGL et audio n’exigent pas d’appeler getUserMedia ; des identifiants et libellés de périphériques renseignés exigent en revanche une permission média ou une capture.

Les métriques réseau ajoutent une tranche indépendante de plus. navigator.connection.effectiveType prend les valeurs slow-2g, 2g, 3g ou 4g, les champs rtt et downlink estiment la latence et le débit, et saveData signale un mode d’économie de données. Les entrées de performance.getEntriesByType('resource') portent nextHopProtocol, transferSize, encodedBodySize et decodedBodySize, donc une page peut distinguer le protocole de connexion et la taille du corps transféré sans accéder au contenu de la réponse.

Le registre de détecteurs BotD montre quels contrôles un détecteur open source exécute réellement, et ce que les suites de détection publiques testent vraiment compare les ensembles de surfaces échantillonnés par plusieurs suites publiques. L’intérêt de les lister ensemble est qu’ils sont indépendants. Un détecteur qui n’échantillonne que le minutage, que le canvas ou que les drapeaux de navigation regarde une autre tranche de la même session, et un changement de navigateur qui satisfait une tranche peut en déplacer une autre.

Pourquoi deux détecteurs divergent sur une session

La divergence est structurelle, pas un défaut dans l’un des deux produits.

Chaque fournisseur possède son modèle

La sortie d’un détecteur est un score produit par des pondérations et des lignes de passage que le fournisseur choisit et révise. Deux fournisseurs peuvent échantillonner la même session et aboutir à des verdicts différents pour trois raisons ordinaires : ils échantillonnent des ensembles de surfaces différents, ils pondèrent différemment une surface commune, et ils placent leur ligne de passage à des endroits différents. Aucune de ces raisons n’est visible depuis le navigateur.

C’est pourquoi un « taux de réussite » ne peut pas être énoncé sans son périmètre. Citer un nombre sans nommer la version du modèle, la cible et la session revient à citer une mesure dont on a retiré les conditions.

Raison de la divergenceCe qui diffèreCe que le navigateur peut y faire
Ensembles de surfaces différentsUn fournisseur lit le minutage, un autre le canvasRien directement ; la surface est le choix du fournisseur
Pondérations différentesLe même signal compte plus ou moinsRien ; les pondérations sont internes
Lignes de passage différentesLa ligne se situe ailleursRien ; la ligne n’est pas publiée
Version de détecteur différenteLe modèle a changé entre deux versionsRetester après chaque version
Cible différenteUn autre site applique une autre configurationTester la cible réelle

Le même navigateur, deux verdicts

Une session qui passe chez un fournisseur et échoue chez un autre est le cas normal plutôt que la contradiction qu’elle paraît être. Le fournisseur qui accepte peut ne pas échantillonner la surface qui a changé ; celui qui refuse peut n’échantillonner que celle-là. Une équipe qui lit la paire comme « le navigateur est à moitié accepté » a inventé une métrique qu’aucun fournisseur ne publie.

La lecture utile est plus étroite. Chaque verdict est une affirmation sur le modèle d’un détecteur appliqué à une session. Deux verdicts ensemble disent que la session se situe près d’une frontière dans un modèle et confortablement à l’intérieur d’un autre, ce qui est une information sur la frontière plutôt que sur le navigateur.

Ce que « non détecté » ne peut pas signifier

Le mot promet un résultat qu’aucun changement local ne peut fournir, parce que le résultat est produit ailleurs par un modèle que l’opérateur ne contrôle pas. Une configuration peut retirer un drapeau précis, aligner un ensemble précis de signaux et garder un profil cohérent pendant une exécution. Elle ne peut pas décider ce que le modèle d’un fournisseur fera du résultat, et elle ne peut pas promettre que le modèle restera identique le mois prochain.

Traiter le mot comme une affirmation produit plutôt que comme la description d’une observation passée est une erreur que cette catégorie invite à commettre. Un fournisseur qui publie un taux de réussite a publié une mesure dans des conditions qui ne sont peut-être pas les vôtres.

Remplacer l’affirmation par un relevé de mesure

L’alternative à une affirmation est un relevé qui peut être revérifié. Il comporte cinq parties, et chacune est peu coûteuse.

Les cinq champs

Le premier est le détecteur : son nom et la version ou la date du modèle qui a produit le verdict. Sans version, un résultat ne peut pas être reproduit après une mise à jour du fournisseur. Le second est l’ensemble de surfaces que le détecteur a rapporté, dans ses propres termes, parce que les noms de catégories d’un fournisseur sont le seul vocabulaire partagé disponible. Le troisième est la ligne de passage ou la catégorie dans laquelle le verdict est tombé, pas un pourcentage converti. Le quatrième est la configuration de session : compilation du navigateur, identifiant de profil, drapeaux de lancement, route, langue, fuseau horaire et état d’isolation du document. Le cinquième est l’horodatage et la cible.

ChampForme d’exemplePourquoi il doit être consigné
Identité du détecteurnom du fournisseur plus date du modèleUn changement de modèle invalide une comparaison
Surfaces rapportéesles libellés de catégorie du fournisseurCes libellés sont le seul vocabulaire partagé
Catégorie du verdictpass, challenge, block ou le terme du fournisseurUn pourcentage converti perd la ligne de passage
Configuration de sessioncompilation, profil, drapeaux, route, langue, isolationDeux configurations ne font pas une mesure
Cible et instantclasse d’URL plus horodatageLe même fournisseur note différemment des cibles différentes

Consigner la configuration qui a produit un verdict

Le champ de configuration est facile à omettre, et c’est celui qui rend le relevé utile. Un identifiant de compilation, un identifiant de profil, les drapeaux de lancement en vigueur, la région de sortie de la route, la langue négociée et l’état d’isolation des origines du document décrivent ensemble la session assez précisément pour qu’une seconde exécution puisse être configurée à l’identique. Consigner l’état d’isolation compte pour la raison donnée dans la section sur le minutage : il change d’un facteur vingt la résolution qu’une sonde peut observer.

Consignez les valeurs effectives plutôt que celles demandées. Une langue demandée que le site a remplacée, ou une route demandée qui a basculé, produit une session qui ne correspond pas au relevé sauf si le relevé capture ce qui s’est réellement appliqué.

Un tableau de résultats au lieu d’un adjectif

Le livrable qui résiste à l’examen est un tableau avec une ligne par détecteur et une colonne par champ ci-dessus, plus une colonne pour le verdict observé et une colonne pour le mode de défaillance quand un détecteur a bloqué. Un lecteur voit alors qu’un navigateur a passé deux détecteurs et a été mis au défi par un troisième, et peut décider si le troisième compte pour sa cible.

Ce tableau est aussi la réponse honnête à la question que le nom du produit suggère. Il dit ce qui a été mesuré, par qui, sous quelle configuration et quand. Il ne dit pas « non détecté » comme propriété, parce que ce mot effacerait chaque colonne.

Ce qu’il faut retester après un changement

Trois changements invalident un résultat stocké. Une version de détecteur change le modèle, donc la ligne doit être remesurée plutôt que relue. Une mise à jour de navigateur ou de profil change la configuration de session, donc le champ de configuration de la ligne ne correspond plus. Un changement de cible, y compris une nouvelle version de contrôle sur le même site, change la chose testée.

Tout le reste peut être réutilisé. C’est l’avantage pratique du relevé : il transforme une question ouverte en un petit ensemble de lignes à rafraîchir quand quelque chose de précis change.

FAQ

Passer navigator.webdriver à false suffit-il à éviter un verdict ?

Non. MDN documente la propriété comme un signal qui rapporte si des drapeaux d’automatisation ont été utilisés, et un détecteur est libre de lui attribuer un poids nul ou de le recouper avec d’autres observations. Une page qui lit le booléen a lu un bit ; le modèle d’un fournisseur en lit beaucoup, et les pondérations du modèle ne sont pas publiées.

Pourquoi le même navigateur passe-t-il un détecteur et échoue-t-il chez un autre ?

Parce que les deux fournisseurs échantillonnent des surfaces différentes, pondèrent différemment les surfaces communes et placent leur ligne de passage à des endroits différents. Une session près d’une frontière dans un modèle peut se situer confortablement à l’intérieur d’un autre. La paire de verdicts décrit deux modèles, pas deux moitiés d’un navigateur.

Un taux de réussite peut-il être publié comme propriété d’un produit ?

Un taux ne peut être publié qu’avec ses conditions : détecteur et version de modèle, cible, configuration de session et fenêtre de mesure. Sans elles, le nombre décrit une mesure qui ne peut pas être reproduite, et une mise à jour ultérieure du fournisseur peut l’invalider sans aucun changement côté navigateur.

Conclusion pratique

Partez de la liste des surfaces plutôt que de l’adjectif. Lisez ce qu’une page de contrôle peut échantillonner, notez que navigator.webdriver rapporte un drapeau de lancement et que la résolution de performance.now() dépend de l’état d’isolation du document, et acceptez qu’un verdict soit produit par un modèle que l’opérateur ne contrôle pas.

L’action suivante tient en un tableau. Choisissez le détecteur qui compte pour votre cible, consignez son nom et la date de son modèle, les surfaces rapportées, la catégorie renvoyée et la configuration complète de session, y compris l’état d’isolation, puis exécutez-le deux fois dans la même configuration pour voir si la ligne est stable. Deux lignes identiques prouvent que la mesure se répète ; elles ne prouvent pas un verdict, et cette distinction est tout l’enjeu.

Sources

#Navigateur Non Détecté#Détection De Bots#Empreinte#Navigator.webdriver#Minutage

Cet article fait partie du guide : Qu'est-ce qu'une empreinte de navigateur ?

Exécutez la même vérification dans BotBrowser

Chargez un profil, gardez dans le navigateur les signaux que vous venez de lire, puis confirmez le résultat sur votre propre machine avant le déploiement.