Como tornar :visited mais particular

Kyra Seevers
Kyra Seevers

Publicado em 2 de abril de 2025

O que acontece quando você clica em um link? Ele fica roxo.

Desde os primeiros dias da Internet, os sites dependem do seletor :visited do CSS para aplicar estilos personalizados aos links em que os usuários clicaram antes. Usando o seletor :visited, os sites podem melhorar a experiência do usuário e ajudar os usuários a navegar na Web. No entanto, à medida que a personalização dos links visitados aumentou com o tempo, o mesmo aconteceu com o número crescente de ataques descobertos por pesquisadores de segurança.

Esses ataques podem revelar quais links um usuário visitou e vazar detalhes sobre a atividade de navegação na Web. Esse problema de segurança tem atormentado a Web há mais de 20 anos, e os navegadores têm implantado várias soluções temporárias para mitigar esses ataques de detecção de histórico. Embora as mitigações reduzam a velocidade dos ataques, elas não os eliminam.

A partir do Chrome 136, o Chrome é o primeiro navegador importante a tornar esses ataques obsoletos. Isso é feito dividindo o histórico de links :visited.

Para mostrar os links que você visitou anteriormente, o navegador precisa acompanhar as páginas que você visitou ao longo do tempo. Isso é chamado de histórico :visited. É possível estilizar os links visitados de forma diferente dos não visitados usando o seletor :visited do CSS:

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

Historicamente, o histórico de :visited não era particionado. Isso significa que não havia restrições sobre onde o histórico de :visited podia ser mostrado usando o seletor :visited. Se você clicar em um link, ele vai aparecer como :visited em todos os sites que mostram esse link. Essa foi a falha de design principal que permitiu que os ataques revelassem informações sobre o histórico de navegação do usuário.

Veja o exemplo a seguir. Você está navegando no Site A e clica em um link para acessar o Site B. Nesse cenário, o Site B seria adicionado ao seu histórico de :visited. Mais tarde, você pode visitar o Site Evil, que também cria um link para o Site B. Sem o particionamento, o Site Evil mostraria esse link para o Site B como :visited, mesmo que você não tivesse clicado nele no Site Evil. Em seguida, o Site Maligno poderia usar uma exploração de segurança para saber se o link foi estilizado como :visited, ou seja, saber que você visitou o Site B no passado, vazando informações sobre seu histórico de navegação.

Antes da partição, quando você clicou em um link:

Mostra o usuário na página site-a.com, que mostra um link para site-b.com.

Ele vai aparecer como :visited em todos os sites que exibem esse link.

Mostra o mesmo site-a.com ao lado de site-evil.com. As duas páginas mostram o mesmo link para site-b.com e têm o estilo "visitado".

A partição protege seu histórico de navegação mostrando um link como visitado apenas se você tiver clicado nele antes. Se você não interagiu com esse site antes, os links dele não vão ter o estilo :visited.

Considere o exemplo anterior, mas com o particionamento ativado. Você está navegando no Site A e clica em um link para acessar o Site B. A combinação de "Site A + Site B" é armazenada no seu histórico de acessos. Dessa forma, quando você visitar o Site Evil, o link para o Site B não será mostrado como :visited, porque não corresponde a ambas as partes da entrada "Site A + Site B" (o contexto em que você clicou no link). Como não há histórico de navegação mostrado no Site Evil, ele não pode aproveitar nenhuma exploração. Portanto, seu histórico de navegação está seguro.

Depois de particionar, ao clicar em um link:

Mostra o usuário na página site-a.com, que mostra um link para site-b.com.

Ele só aparece como :visited onde você clicou antes.

Mostra o mesmo site-a.com ao lado de site-evil.com. As duas páginas mostram o mesmo link para site-b.com, e apenas o link em site-a.com tem o estilo "visitado".

Em resumo, o particionamento se refere ao armazenamento dos seus links com informações adicionais sobre onde eles foram clicados. No Chrome, são: URL do link, site de nível superior e origem do frame. Com o particionamento ativado, o histórico de :visited não é mais uma lista global que qualquer site pode consultar. Em vez disso, o histórico de :visited é "particionado" ou separado pelo contexto em que você acessou esse link.

Mostra o fluxo de informações pelo URL do link, site de nível superior e origem do frame.

Ao navegar na Internet, você pode clicar em vários links que apontam para diferentes subpáginas no mesmo site. Por exemplo, ao pesquisar diferentes tipos de metais, você pode visitar as páginas Site.Wiki de "cromo" e "latão".

Em uma implementação rígida do particionamento, os usuários na página Site.Wiki de ouro não teriam os links para as páginas de latão e cromado exibidos como :visited. Isso ocorre porque o usuário clicou em cada uma dessas páginas de um site de nível superior que não corresponde à página Site.Wiki do ouro.

Embora o usuário tenha visitado um conjunto de links no site.wiki de metals.com, eles não são estilizados como visitados porque o clique foi feito em metals.com.

Para melhorar a experiência do usuário nesse cenário e ainda oferecer a privacidade e as proteções de segurança do particionamento, introduzimos uma exceção para autolinks. Em resumo, um site pode mostrar as próprias subpáginas como :visited, mesmo que esses links não tenham sido clicados nesse contexto antes. Como os sites têm outros métodos de rastreamento para saber se um usuário visitou as subpáginas, nenhuma nova informação é fornecida a esses sites com a introdução de autolinks. A partição ainda protege contra o rastreamento entre sites e aplica a política de mesma origem. No entanto, isso só se aplica a links para subpáginas de um site. Links para sites de terceiros ou em iframes de terceiros não estão qualificados para essa exceção.

Após a exclusão de "autolinks":

Os links próprios agora são marcados como visitados quando são subpáginas do mesmo site.

Status da implementação

Essas melhorias na segurança e privacidade do :visited estão disponíveis a partir da versão 136 do Chrome. O Chrome é o primeiro navegador a implementar essas proteções para os usuários.

Engajamento e compartilhamento de feedback