Cómo hacer que :visited sea más privado

Kyra Seevers
Kyra Seevers

Fecha de publicación: 2 de abril de 2025

¿Qué sucede cuando haces clic en un vínculo? Se vuelve morado.

Desde los inicios de Internet, los sitios dependen del selector :visited de CSS para aplicar estilos personalizados a los vínculos en los que los usuarios hicieron clic anteriormente. Con el selector :visited, los sitios pueden mejorar la experiencia del usuario y ayudarlos a navegar por la Web. Sin embargo, a medida que la personalización de los vínculos visitados aumentó con el tiempo, también lo hizo la cantidad creciente de ataques que descubrieron los investigadores de seguridad.

Estos ataques pueden revelar qué vínculos visitó un usuario y filtrar detalles sobre su actividad de navegación web. Este problema de seguridad ha plagado la Web durante más de 20 años, y los navegadores desplegaron varias soluciones temporales para mitigar estos ataques de detección de historial. Si bien estas mitigaciones ralentizan los ataques, no los eliminan.

A partir de Chrome 136, Chrome es el primer navegador importante que hace que estos ataques sean obsoletos. Esto se logra mediante la partición del historial de vínculos de :visited.

Para mostrar los vínculos que visitaste anteriormente, el navegador debe hacer un seguimiento de las páginas que visitaste con el tiempo, lo que se denomina historial de :visited. Puedes aplicar un diseño diferente a los vínculos visitados y a los no visitados con el selector :visited de CSS:

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

Históricamente, el historial de :visited no estaba particionado. Esto significaba que no había restricciones sobre dónde se podía mostrar el historial de :visited con el selector :visited. Si hiciste clic en un vínculo, este se mostrará como :visitado en todos los sitios que muestren ese vínculo. Esta fue la falla de diseño principal que permitió que los ataques revelaran información sobre el historial de navegación del usuario.

Considera el siguiente ejemplo: Estás navegando en el Sitio A y haces clic en un vínculo para ir al Sitio B. En este caso, el sitio B se agregaría a tu historial de :visited. Más tarde, puedes visitar el sitio Evil, que también crea un vínculo al sitio B. Sin particiones, el sitio Evil mostraría ese vínculo al sitio B como :visited, aunque no hayas hecho clic en el vínculo en el sitio Evil. Luego, el sitio malicioso podría usar un exploit de seguridad para saber si el vínculo tenía el estilo :visited, por lo que sabría que visitaste el sitio B en el pasado, lo que filtraría información sobre tu historial de navegación.

Antes de particionar, cuando hiciste clic en un vínculo, sucedió lo siguiente:

Muestra al usuario en la página site-a.com, que muestra un vínculo a site-b.com.

Se mostrará como :visited en todos los sitios que muestren ese vínculo.

Muestra el mismo sitio-a.com junto con sitio-malicioso.com. Ambas páginas muestran el mismo vínculo a sitio-b.com y se aplica el diseño de visitado.

La partición protege tu historial de navegación, ya que solo muestra un vínculo como visitado si ya hiciste clic en él desde este sitio. Si no interactuaste con este sitio antes, sus vínculos no tendrán el estilo :visited.

Considera el ejemplo anterior, pero con la partición habilitada. Si estás navegando en el sitio A y haces clic en un vínculo para ir al sitio B, la combinación de "sitio A + sitio B" se almacena en tu historial de sitios visitados. De esta manera, cuando visites el sitio Evil, su vínculo al sitio B no se mostrará como :visited porque no coincide con ambas partes de nuestra entrada "Sitio A + Sitio B" (el contexto en el que hiciste clic originalmente en el vínculo). Como no se muestra ningún historial de navegación en Site Evil, no puede aprovecharse de ningún exploit. Por lo tanto, tu historial de navegación está protegido.

Después de particionar, cuando hagas clic en un vínculo, sucederá lo siguiente:

Muestra al usuario en la página site-a.com, que muestra un vínculo a site-b.com.

Solo se muestra como :visited en los lugares en los que hiciste clic antes.

Muestra el mismo sitio site-a.com junto con site-evil.com. Ambas páginas muestran el mismo vínculo a site-b.com y solo el vínculo en site-a.com tiene el estilo de visitado.

En resumen, la partición se refiere al almacenamiento de tus vínculos con información adicional sobre dónde se hizo clic en ellos. En Chrome, son los siguientes: URL del vínculo, sitio de nivel superior y origen del marco. Con el particionamiento habilitado, tu historial de :visited ya no es una lista global que cualquier sitio puede consultar. En cambio, tu historial de :visited está "particionado" o separado por el contexto desde el que visitaste ese vínculo en primer lugar.

Muestra el flujo de información a través de la URL del vínculo, el sitio de nivel superior y el origen del marco.

Cuando navegas por Internet, es posible que hagas clic en muchos vínculos que dirigen a diferentes subpáginas del mismo sitio. Por ejemplo, cuando investigues diferentes tipos de metales, puedes visitar las páginas de Site.Wiki para “cromo” y “latón”.

En una implementación rígida de la partición, los usuarios de la página Site.Wiki para el oro no tendrían los vínculos a las páginas de cromo y latón que se muestran como :visited. Esto se debe a que el usuario hizo clic en cada una de estas páginas desde un sitio de nivel superior que no coincide con la página Site.Wiki de oro.

Aunque el usuario visitó un conjunto de vínculos en site.wiki desde metals.com, no se les aplica el estilo visitado porque el clic se realizó desde metals.com.

Para mejorar la experiencia del usuario en esta situación y, al mismo tiempo, proporcionar las protecciones de privacidad y seguridad de la partición, presentamos una excepción para los autovínculos. En resumen, un sitio puede mostrar sus propias subpáginas como :visited, incluso si no se hizo clic en estos vínculos en este contexto antes. Debido a que los sitios tienen otros métodos para hacer un seguimiento de si un usuario visitó sus subpáginas, no se les proporciona información nueva con la introducción de los vínculos directos. El particionamiento aún protege contra el seguimiento entre sitios y aplica la política de origen. Sin embargo, es importante tener en cuenta que esto solo se aplica a los vínculos a las subpáginas de un sitio. Los vínculos a sitios de terceros o en iframes de terceros no son aptos para esta excepción.

Después de la eliminación de los "vínculos a sí mismos":

Los vínculos directos ahora se marcan como visitados cuando son subpáginas del mismo sitio.

Estado de implementación

Estas mejoras en la seguridad y la privacidad de :visited están disponibles a partir de la versión 136 de Chrome. Chrome es el primer navegador en implementar estas protecciones para los usuarios.

Interactúa y comparte comentarios