En 2018, suivre un visiteur d'un site web ressemblait à un problème de JavaScript : un script envoie une balise au chargement de la page ou lors d'un clic, et si le scripting est bloqué, désactivé ou filtré, tout le canal s'éteint. Crooked Style Sheets, une preuve de concept du développeur jbtronics, a montré qu'une page peut être suivie sans aucun JavaScript, en utilisant uniquement le moteur CSS du navigateur lui-même.

Les approches évidentes reposaient toutes sur des scripts ou des pixels : un extrait de suivi qui appelle la maison, une balise image, un SDK d'analyse tiers. Chacune d'elles est une classe de requête visible que les bloqueurs de scripts et les filtres publicitaires ont été conçus pour intercepter, et aucune ne se déclenche sur une page où le scripting ne s'exécute jamais.

L'astuce résidait dans le moment où les navigateurs récupèrent les ressources CSS url() : uniquement lorsqu'un sélecteur correspond. Un style :active de lien avec content: url(track.php?action=link2_clicked) fait donc que le navigateur demande cette URL exactement au moment où le lien est cliqué. Le même principe couvrait le survol, les cases cochées, le texte correspondant à un motif via :valid, la détection du navigateur via @supports, et la détection des polices installées grâce à un repli @font-face qui se charge lorsque Calibri est absent. Chaque requête atteignait une page PHP qui enregistrait l'horodatage et l'action encodée dans son URL.

Comme les requêtes sont des chargements de ressources ordinaires pilotés par CSS, elles ne portent aucun appel de script qu'un bloqueur pourrait identifier, et les feuilles de style s'appliquent toujours lorsque JavaScript est désactivé. Le billet Hacker News de janvier 2018 a recueilli 532 points et 175 commentaires, et le dépôt comptait environ 3,3 k étoiles et 132 forks en 2026. La défense qu'il a suscitée incluait l'extension CSS Exfil Protection, et l'auteur soutenait que la correction robuste consistait pour les navigateurs à récupérer le contenu externe référencé par CSS au chargement de la page plutôt qu'à la demande, un changement dont il reconnaissait qu'il coûterait en performance.

Traiter les récupérations paresseuses de ressources CSS par le navigateur comme des balises d'événements : les sélecteurs qui ne correspondent qu'au clic, au survol ou à une police manquante déclenchent une requête que le serveur peut journaliser

Les navigateurs décident quand récupérer le contenu des url() CSS, donc un sélecteur correspondant produit une requête réseau sans appel JavaScript qu'un bloqueur de publicité peut cibler.

Les requêtes ressemblent à des chargements ordinaires d'images ou de polices, indiscernables d'actifs légitimes dans les journaux et la plupart des outils de blocage.

Les sélecteurs dépendant de l'état encodent le sens dans l'URL elle-même : le chemin de la ressource nomme l'événement, et le serveur ne journalise que les horodatages d'arrivée.

Le CSS s'applique toujours sur les pages où le scripting est désactivé, comblant le fossé qui faisait passer l'absence de JavaScript pour de la confidentialité.

Les formats déclaratifs effectuent encore un travail conditionnel : tout chargement de ressource dépendant de l'état est un signal observable, donc les défenses doivent traiter les requêtes d'origine CSS comme un comportement qu'il vaut la peine de restreindre

Le dépôt est arrivé sur Hacker News le 16 janvier 2018 et a recueilli 532 points et 175 commentaires ; lors de l'exploration de 2026, il affichait environ 3,3 k étoiles et 132 forks. La démonstration a suscité au moins une défense, l'extension CSS Exfil Protection liée depuis son propre README, et le texte de l'auteur soutenait que la correction durable consistait pour les navigateurs à charger le contenu externe référencé par CSS au chargement de la page plutôt que lorsqu'un sélecteur correspond, un changement dont il notait qu'il coûterait en performance. Le site de démonstration original est ensuite devenu inaccessible, laissant les exemples de code du dépôt comme trace fonctionnelle de la technique.

VÉRIFIEZ LES SOURCES

Les sources

  1. CrookedStyleSheets - Webpage tracking only using CSS (and no JS) GitHub · github.com
  2. Crooked Style Sheeding - Webpage tracking using only CSS Hacker News · news.ycombinator.com ·