Rendre :visited plus privé

Kyra Seevers
Kyra Seevers

Publié le 2 avril 2025

Que se passe-t-il lorsque vous cliquez sur un lien ? Il devient violet !

Depuis les débuts d'Internet, les sites Web s'appuient sur le sélecteur CSS :visited pour appliquer des styles personnalisés aux liens sur lesquels les utilisateurs ont déjà cliqué. Grâce au sélecteur :visited, les sites peuvent améliorer leur expérience utilisateur et aider leurs utilisateurs à naviguer sur le Web. Cependant, à mesure que la personnalisation des liens visités a augmenté au fil du temps, le nombre croissant d'attaques découvertes par les chercheurs en sécurité a également augmenté.

Ces attaques peuvent révéler les liens qu'un utilisateur a consultés et divulguer des informations sur son activité de navigation sur le Web. Ce problème de sécurité affecte le Web depuis plus de 20 ans, et les navigateurs ont déploqué diverses mesures palliatives pour atténuer ces attaques de détection de l'historique. Bien que ces mesures de mitigation ralentissent les attaques, elles ne les éliminent pas.

À partir de Chrome 136, Chrome est le premier navigateur majeur à rendre ces attaques obsolètes. Pour ce faire, partitionnez l'historique des liens :visited.

Pour afficher les liens que vous avez déjà consultés, le navigateur doit suivre les pages que vous avez consultées au fil du temps. C'est ce que l'on appelle l'historique :visited. Vous pouvez styliser les liens visités différemment des liens non visités à l'aide du sélecteur CSS :visited:

:visited {
  color: purple;
  background-color: yellow;
  }

Historiquement, l'historique :visited n'était pas partitionné. Cela signifiait qu'il n'y avait aucune restriction sur l'emplacement où l'historique :visited pouvait être affiché à l'aide du sélecteur :visited. Si vous avez cliqué sur un lien, il s'affichera comme :visited sur tous les sites qui affichent ce lien. C'est ce défaut de conception de base qui a permis aux attaques de révéler des informations sur l'historique de navigation de l'utilisateur.

Voici un exemple. Vous consultez le site A et cliquez sur un lien pour accéder au site B. Dans ce scénario, le site B sera ajouté à votre historique :visited. Plus tard, vous pouvez visiter le site Evil, qui crée également un lien vers le site B. Sans partitionnement, le site Evil afficherait ce lien vers le site B sous la forme :visited, même si vous n'aviez pas cliqué sur le lien sur le site Evil. Le site malveillant peut ensuite utiliser une faille de sécurité pour savoir si le lien a été stylisé en tant que :visited, et ainsi savoir que vous avez déjà visité le site B, ce qui divulgue des informations sur votre historique de navigation.

Avant le partitionnement, lorsque vous cliquiez sur un lien:

L'utilisateur est redirigé vers la page site-a.com, qui affiche un lien vers site-b.com.

Il s'affichera comme :visited sur tous les sites affichant ce lien.

Affiche le même site-a.com à côté de site-evil.com. Les deux pages affichent le même lien vers site-b.com, qui est présenté comme ayant été consulté.

La partitionnement protège votre historique de navigation en n'affichant un lien comme visité que si vous avez déjà cliqué dessus à partir de ce site. Si vous n'avez jamais interagi avec ce site auparavant, ses liens ne seront pas stylisés en tant que :visited.

Prenons l'exemple précédent, mais avec le partitionnement activé. Vous consultez le site A et cliquez sur un lien pour accéder au site B. La combinaison "Site A + Site B" est stockée dans votre historique des visites. Ainsi, lorsque vous accédez au site Evil, son lien vers le site B ne s'affichera pas sous la forme :visited, car il ne correspond pas aux deux parties de notre entrée "Site A + Site B" (le contexte dans lequel vous avez initialement cliqué sur le lien). Étant donné qu'aucun historique de navigation n'est affiché sur Site Evil, il ne peut pas exploiter d'exploits. Votre historique de navigation est donc sécurisé.

Après le partitionnement, lorsque vous cliquez sur un lien:

L'utilisateur est redirigé vers la page site-a.com, qui affiche un lien vers site-b.com.

Il ne s'affiche en tant que :visited que là où vous avez déjà cliqué dessus.

Affiche le même site-a.com à côté de site-evil.com. Les deux pages affichent le même lien vers site-b.com, et seul le lien sur site-a.com est affiché comme ayant été visité.

En résumé, le partitionnement consiste à stocker vos liens avec des informations supplémentaires sur les emplacements où ils ont été cliqués. Dans Chrome, il s'agit de l'URL du lien, du site de premier niveau et de l'origine du frame. Lorsque le partitionnement est activé, votre historique :visited n'est plus une liste globale que n'importe quel site peut interroger. Au lieu de cela, votre historique :visited est "partitionné" ou séparé par le contexte à partir duquel vous avez accédé à ce lien.

Indique le flux d'informations via l'URL du lien, le site de premier niveau et l'origine du frame.

Lorsque vous naviguez sur Internet, vous pouvez finir par cliquer sur de nombreux liens qui redirigent tous vers différentes sous-pages du même site. Par exemple, lorsque vous recherchez différents types de métaux, vous pouvez consulter les pages Site.Wiki pour "chrome" et "laiton".

Dans le cas d'une implémentation rigide de la partitionnement, les liens vers les pages chrome et laiton ne s'afficheraient pas sous la forme :visited pour les utilisateurs de la page Site.Wiki pour l'or. En effet, l'utilisateur a cliqué sur chacune de ces pages à partir d'un site de premier niveau qui ne correspond pas à la page Site.Wiki pour l'or.

Même si l'utilisateur a accédé à un ensemble de liens sur site.wiki à partir de metals.com, ils ne sont pas stylisés en tant que visités, car le clic a été effectué depuis metals.com.

Pour améliorer l'expérience utilisateur dans ce scénario tout en offrant les protections de confidentialité et de sécurité de la partitionnement, nous avons introduit une exception pour les auto-liens. En résumé, un site peut afficher ses propres sous-pages en tant que :visited, même si les utilisateurs n'ont jamais cliqué dessus dans ce contexte auparavant. Étant donné que les sites disposent d'autres méthodes pour savoir si un utilisateur a consulté ses sous-pages, aucune nouvelle information n'est fournie à ces sites avec l'introduction des liens internes. La partitionnement protège toujours contre le suivi intersites et applique la règle de même origine. Toutefois, il est important de noter que cela ne s'applique qu'aux liens vers les sous-pages d'un site. Les liens vers des sites tiers ou dans des iFrames tiers ne sont pas éligibles à cette exception.

Après la suppression des liens internes:

Les liens vers soi sont désormais marqués comme visités lorsqu'ils sont des sous-pages du même site.

État de l'implémentation

Ces améliorations de la sécurité et de la confidentialité de :visited sont disponibles à partir de la version 136 de Chrome. Chrome est le premier navigateur à implémenter ces protections pour les utilisateurs.

Interagir et envoyer des commentaires