Делаем :visit более приватным

Кира Сиверс
Kyra Seevers

Опубликовано: 2 апреля 2025 г.

Что происходит, когда вы нажимаете ссылку? Он становится фиолетовым!

С первых дней существования Интернета сайты использовали селектор CSS :visited для применения пользовательских стилей к ссылкам, на которые пользователи нажимали раньше. Используя селектор :visited , сайты могут улучшить взаимодействие с пользователем и помочь пользователям перемещаться в Интернете. Однако по мере того, как возможности настройки посещаемых ссылок со временем расширяются, растет и число атак, обнаруженных исследователями безопасности .

Эти атаки могут выявить, какие ссылки посещал пользователь, и раскрыть подробную информацию о его активности в Интернете. Эта проблема безопасности преследует Интернет уже более 20 лет, и браузеры внедрили различные меры для смягчения этих атак с обнаружением истории. Хотя эти меры по смягчению последствий замедляют атаки, они не устраняются.

Начиная с Chrome 136, Chrome стал первым крупным браузером, который сделал эти атаки устаревшими. Это достигается путем секционирования истории :visited ссылок.

Чтобы отобразить ссылки, которые вы посещали ранее, браузер должен отслеживать страницы, которые вы посетили с течением времени — это называется вашей историей :visited . Вы можете стилизовать посещенные ссылки иначе, чем непосещенные, используя селектор CSS :visited :

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

Исторически :visited History была неразделенной . Это означало, что не было никаких ограничений на то, где можно отображать историю :visited с помощью селектора :visited . Если вы щелкнете ссылку, она будет отображаться как :visited на каждом сайте, отображающем эту ссылку. Это был основной недостаток дизайна, который позволял атакам раскрывать информацию об истории просмотров пользователя.

Рассмотрим следующий пример. Вы просматриваете сайт А и щелкаете ссылку, чтобы перейти на сайт Б. В этом случае сайт Б будет добавлен в вашу историю :visited . Позже вы можете посетить Сайт Зла, который также создаст ссылку на Сайт Б. Без разделения Site Evil отобразил бы эту ссылку на Сайт B как :visited — даже если вы не нажимали ссылку на Site Evil. Затем Site Evil может использовать эксплойт безопасности, чтобы узнать, была ли ссылка оформлена как :visited , и таким образом узнать, что вы посещали сайт B в прошлом, что приведет к утечке информации о вашей истории посещений.

Перед разделением, когда вы щелкнули ссылку:

Показывает пользователя на странице site-a.com, на которой отображается ссылка на site-b.com.

Это будет отображаться как :visited на каждом сайте, отображающем эту ссылку!

Показывает один и тот же сайт site-a.com рядом с site-evil.com. На обеих страницах отображается одна и та же ссылка на site-b.com, и она оформлена как посещенная.

Разделение защищает вашу историю просмотров, показывая ссылку как посещенную только в том случае, если вы уже нажимали на эту ссылку с этого сайта раньше. Если вы ранее не взаимодействовали с этим сайтом, его ссылки не будут иметь стиль :visited .

Рассмотрим предыдущий пример, но с включенным секционированием. Вы просматриваете сайт А и нажимаете ссылку, чтобы перейти на сайт Б. Комбинация «Сайт А + Сайт Б» сохраняется в вашей истории посещений. Таким образом, когда вы посещаете Сайт Зла, его ссылка на Сайт Б не будет отображаться как :visited , поскольку она не соответствует обеим частям нашей записи «Сайт А + Сайт Б» (контекст, в котором вы первоначально щелкнули ссылку). Поскольку на Site Evil не отображается история посещений, он не может воспользоваться никакими эксплойтами. Поэтому история вашего браузера в безопасности!

После разделения при нажатии на ссылку:

Показывает пользователя на странице site-a.com, на которой отображается ссылка на site-b.com.

Он отображается как :visited только там, где вы нажимали на него раньше!

Показывает один и тот же сайт site-a.com рядом с site-evil.com. Обе страницы отображают одну и ту же ссылку на site-b.com, и только ссылка на site-a.com оформлена как посещенная.

Короче говоря, под секционированием подразумевается хранение ваших ссылок с дополнительной информацией о том, где по ним нажимали. В Chrome это: URL-адрес ссылки, сайт верхнего уровня и источник фрейма . При включенном секционировании ваша история :visited больше не является глобальным списком, который может запросить любой сайт. Вместо этого ваша история :visited «разделена» или отделена контекстом, из которого вы изначально посетили эту ссылку.

Показывает поток информации через URL-адрес ссылки, сайт верхнего уровня и происхождение фрейма.

Просматривая Интернет, вы можете нажать на множество ссылок, которые ведут на разные подстраницы одного и того же сайта. Например, исследуя различные типы металлов, вы можете посетить страницы Site.Wiki , посвященные «хрому» и «латуни».

При жесткой реализации секционирования пользователи на странице Site.Wiki для золота не будут видеть ссылки на страницы Chrome и Brass, отображаемые как :visited . Это связано с тем, что пользователь нажимал на каждую из этих страниц с сайта верхнего уровня, который не соответствует странице Site.Wiki для золота.

Несмотря на то, что пользователь посетил ряд ссылок на сайте site.wiki с сайта Metals.com, они не обозначены как посещенные, поскольку клик был сделан с сайта Metals.com.

Чтобы улучшить взаимодействие с пользователем в этом сценарии, сохраняя при этом конфиденциальность и безопасность секционирования, мы ввели исключение для самоссылок . Короче говоря, сайт может отображать свои собственные подстраницы как :visited , даже если эти ссылки ранее не нажимались в этом контексте. Поскольку на сайтах есть другие методы отслеживания того, посещал ли пользователь их подстраницы, при добавлении самоссылок на эти сайты не передается никакой новой информации. Секционирование по-прежнему защищает от межсайтового отслеживания и обеспечивает соблюдение политики одного и того же источника. Но важно отметить, что это относится только к ссылкам на собственные подстраницы сайта. Это исключение не распространяется на ссылки на сторонние сайты или в сторонних iframe.

После вырезания «самосвязей»:

Собственные ссылки теперь помечаются как посещенные, если они являются подстраницами одного и того же сайта.

Статус реализации

Эти улучшения безопасности и конфиденциальности :visited доступны начиная с Chrome версии 136. Chrome — первый браузер, реализовавший эти меры защиты для пользователей.

Привлекайте и делитесь отзывами