Privacy outils
Ce qu'un site apprend réellement de votre IP publique, de vos en-têtes de requête et du matériel lisible en JavaScript — et comment expurger fichiers HAR, URL et jetons avant de les partager.
3 outils
Trois observateurs, trois couches de données
Au moment où votre JavaScript s’exécute, le site en sait déjà beaucoup. La couche transport lui a remis l’adresse IP publique par laquelle vous êtes sorti, et de cette seule adresse : l’ASN qui annonce le préfixe, une estimation géographique grossière, la version HTTP négociée et la version TLS que votre client a proposée. Rien de cela n’est optionnel, rien n’implique de cookie, et chaque proxy inverse du chemin en journalise l’essentiel par défaut. Vérifier IP montre ce que votre propre connexion expose — IP, ville, région, pays, FAI, ASN, fuseau horaire, le PoP de périphérie qui a terminé la requête, le protocole HTTP et TLS.
La deuxième couche est ce que le navigateur fournit spontanément dans les en-têtes de
requête : User-Agent, Accept-Language, Accept-Encoding, Referer et les indices
client Sec-CH-UA-*. Peu coûteux à collecter, journalisés partout, et — contrairement à
la couche réseau — déclaratifs, donc aussi trivialement falsifiables. La troisième
couche est ce que le script mesure après le chargement : screen.width et
devicePixelRatio, Intl.DateTimeFormat().resolvedOptions().timeZone,
navigator.hardwareConcurrency, navigator.deviceMemory, maxTouchPoints, plus les
artefacts de rendu issus de <canvas>, de WebGL, d’AudioContext et du sondage des
polices. Empreinte du Navigateur lit cette couche
localement, jusqu’à une signature de rendu canvas.
Le modèle mental qui compte : aucune valeur isolée n’a besoin d’être secrète. Votre
fuseau horaire est une information publique. L’empreinte travaille sur la distribution
conjointe — une valeur partagée par un utilisateur sur 2^k apporte k bits d’entropie, et
les bits s’accumulent, environ 33 bits séparant une personne de 8,6 milliards. Les
signaux corrélés ajoutent moins que la somme de leurs parties (platform: MacIntel et
un agent utilisateur Macintosh sont presque le même bit), si bien que les chiffres
publiés par attribut ne s’additionnent jamais simplement. Panopticlick a mesuré environ
10,0 bits pour le User-Agent, 6,09 pour les en-têtes Accept, 4,83 pour la résolution
d’écran plus la profondeur de couleur et 3,04 pour le fuseau horaire ; les ~18,1 bits
souvent cités étaient la moyenne pour une empreinte entière dans cette étude, dominée
par l’énumération des plugins (15,4 bits) et des polices (13,9 bits) que les navigateurs
modernes ont largement fermée — et comme les valeurs d’en-têtes et d’écran se
recouvrent, elles ne peuvent pas se combiner au-delà de cette moyenne d’empreinte
entière. Des travaux ultérieurs sur une population bien plus large (Gomez-Boix et al.,
2 millions d’empreintes) ont trouvé les navigateurs ordinaires encore moins uniques. La
leçon porte sur le mécanisme plutôt que sur un nombre cible : une douzaine d’attributs
banals suffisent à garder un visiteur qui revient reconnaissable, sans aucun cookie.
Deux conséquences que les ingénieurs prennent à l’envers : l’adresse IP est
l’identifiant le plus durable de la pile et l’un des signaux de localisation les plus
faibles ; et l’entropie est symétrique, si bien que falsifier une valeur vers quelque
chose d’inhabituel vous rend plus identifiable. Un User-Agent se réclamant d’un
iPhone à côté d’un écran 3440×1440, de 16 cœurs de processeur et de
maxTouchPoints: 0 est une empreinte à un seul exemplaire.
Référence des signaux
| Signal | Observateur | Entropie approx. | Stabilité |
|---|---|---|---|
| IP publique | Réseau, avant JS | Élevée, partagée avec les pairs derrière le NAT | Change selon le réseau / le VPN |
| ASN + organisation | Réseau, avant JS | ~5–10 bits | Stable par FAI |
Accept-Language | En-tête de requête | ~5–8 bits | Très stable |
User-Agent, Sec-CH-UA-* | En-tête + JS | ~10 bits, en diminution | Stable jusqu’à la mise à jour du navigateur |
| Fuseau horaire | JS | ~3–5 bits (~400 zones IANA) | Voyage avec vous, pas avec l’IP |
Écran + devicePixelRatio | JS | ~5–8 bits | Change quand vous branchez un moniteur |
Cœurs de processeur (hardwareConcurrency) | JS | ~2–3 bits | Fixe par machine ; un compte brut, non regroupé (6, 10, 12, 20 sont tous courants) |
Mémoire de l’appareil (deviceMemory) | JS | ~1–2 bits | Fixe ; regroupée en 0,25/0,5/1/2/4/8 Go et plafonnée à 8 |
| Rendu canvas | JS | ~8 bits | Très stable par GPU + pilote |
| Chaîne du moteur de rendu WebGL | JS | ~10 bits ou plus | Très stable |
| Énumération des polices | JS | Élevée sur ordinateur de bureau | Stable par installation |
Identifiant en cookie / localStorage | Attribué par le serveur | Unique par conception | Jusqu’à ce que l’utilisateur l’efface |
Les chiffres sont des estimations d’ordre de grandeur issues d’études de population publiées, pas une mesure de votre navigateur : un signal vaut plus de bits dans une population diverse et moins dans une population homogène. Notez que la dernière ligne est le seul identifiant qu’un utilisateur peut supprimer — tout ce qui est au-dessus se régénère à la visite suivante.
Ce qui part avec l’artefact
La plupart des fuites réelles ne sont pas du pistage. C’est un artefact de débogage collé dans un ticket.
| Artefact | Ce que le destinataire obtient | Champs qui le portent |
|---|---|---|
| Export HAR | Une session fonctionnelle, plus chaque corps de réponse que cet onglet pouvait lire | Cookie, Set-Cookie, Authorization, x-api-key, ?token=, postData.text, content.text |
| Une URL dans un ticket | L’identité du compte, et un accès qui continue de fonctionner jusqu’à expiration | ?session=, ?sig=, X-Amz-Signature, paramètres de suivi contenant un courriel haché |
| Un JWT dans un rapport de bug | Qui est l’utilisateur et ce qu’il peut faire — aucune clé nécessaire pour le lire | sub, email, tenant, roles, exp |
En-têtes de courriel bruts, .eml | Le vrai chemin de l’expéditeur et votre topologie interne | Received: (hôte from, IP d’origine), X-Originating-IP, noms d’hôtes internes en by |
| Une ligne de journal dans un ticket | L’IP réelle de l’utilisateur, avec le modèle d’appareil et la version du système | X-Forwarded-For, remote_addr, jetons de modèle du User-Agent (SM-G991B, Build/…) |
| Capture d’écran de DevTools | Quel que soit le panneau ouvert, en pixels qu’aucun détecteur de secrets n’attrapera | Network → corps de la réponse, Application → colonne Value des cookies |
Quel outil pour quelle question
« Sur quelle adresse suis-je en ce moment ? » est la seule question à laquelle on ne
peut pas répondre localement : seul un point de terminaison distant voit l’adresse par
laquelle vous sortez, raison pour laquelle Vérifier IP interroge
api.sitekits.dev (métadonnées renvoyées en écho, rien de conservé). ifconfig vous
donne une adresse de réseau local, pas celle dont votre liste d’autorisation de
pare-feu a besoin. « Que peut lire un script sur cette machine ? » est le cas inverse,
entièrement local : Empreinte du Navigateur couvre les
lignes d’en-têtes, d’écran et de matériel, plus une signature canvas tronquée, mais
n’énumère ni les polices, ni WebGL, ni l’audio — lisez-la comme une aide à
l’inspection, pas comme un score d’unicité. Saisissez plutôt le
Parseur UserAgent quand vous disposez d’une chaîne UA issue
d’un journal et d’aucun navigateur en direct.
Utilisez En-têtes HTTP pour auditer ce qu’une origine dit de
votre confidentialité : Referrer-Policy décide de la part de l’URL transmise à des
tiers, les attributs de Set-Cookie décident de la durée de survie d’un identifiant
attribué. Le chargement est côté serveur : vous obtenez donc les en-têtes bruts de
l’origine sans le bruit du navigateur — les en-têtes seulement, jamais le corps.
Pour acheminer le tableau ci-dessus : passez un export HAR par le
Nettoyeur HAR avant qu’il ne quitte votre machine — il remplace
les en-têtes correspondants, les jetons de chaîne de requête et les deux corps par
[REDACTED] et rapporte combien de valeurs il a touchées — puis ouvrez la copie
assainie dans la Visionneuse HAR pour confirmer que les temps et les
codes de statut dont vous aviez besoin ont survécu ; ce couplage est traité dans le
guide HAR. Développez un lien suspect avec le
Parseur d’URL avant de le coller, décodez un jeton capturé avec le
Décodeur JWT pour voir exactement quelles revendications vous
transmettriez, et passez un bloc d’en-têtes brut dans
Analyse d’En-têtes pour voir la chaîne Received: que vous êtes
sur le point de publier. Ces quatre outils s’exécutent dans la page et ne téléversent
rien. Une capture d’écran n’a pas cette option : recadrez-la, car flouter n’est pas
expurger. L’hygiène des jetons au sens large relève de l’
outillage sécurité et de
/fr/for/security/.
Pièges
Prendre la géolocalisation pour une position
Le champ city indique où le préfixe est enregistré. Les opérateurs mobiles font
atterrir des régions entières sur un seul enregistrement, et un ASN de centre de
données portant une ville d’apparence résidentielle est une contradiction à
investiguer plutôt qu’à croire.
N’expurger que les champs que vous voyez
L’expurgation par motifs compare à une liste fixe de noms d’en-têtes et à des noms de
paramètres contenant
token|key|secret|password|passwd|pwd|auth|session|sig|signature. Un secret dans un
segment de chemin d’URL (/v1/reset/9f3a…) ou sous un nom propre à la maison est
manqué. Parcourez la sortie assainie avant de la joindre.
Oublier que l’URL elle-même est une donnée
Les chaînes de requête atterrissent dans les en-têtes Referer, les journaux d’accès
des CDN, l’historique du navigateur et les chaînes d’analytique. C’est pourquoi les URL
signées expirent, et pourquoi une donnée personnelle ne devrait jamais être un
paramètre de requête. Analysez avant de coller.
Supposer qu’un client HTTP côté navigateur est neutre
Le Testeur REST API envoie les requêtes depuis votre navigateur
droit vers l’URL que vous saisissez — aucun serveur sitekits sur le chemin. Bon pour la
confidentialité, mais la cible voit donc votre IP réelle, votre User-Agent et tout
identifiant que vous collez dans la zone des en-têtes. Utilisez un jeton jetable quand
le point de terminaison n’est pas le vôtre.