Опубликовано: 2 апреля 2025 г.
Что происходит, когда вы нажимаете ссылку? Он становится фиолетовым!
С первых дней существования Интернета сайты использовали селектор CSS :visited
для применения пользовательских стилей к ссылкам, на которые пользователи нажимали раньше. Используя селектор :visited
, сайты могут улучшить взаимодействие с пользователем и помочь пользователям перемещаться в Интернете. Однако по мере того, как возможности настройки посещаемых ссылок со временем расширяются, растет и число атак, обнаруженных исследователями безопасности .
Эти атаки могут выявить, какие ссылки посещал пользователь, и раскрыть подробную информацию о его активности в Интернете. Эта проблема безопасности преследует Интернет уже более 20 лет, и браузеры внедрили различные меры для смягчения этих атак с обнаружением истории. Хотя эти меры по смягчению последствий замедляют атаки, они не устраняются.
Начиная с Chrome 136, Chrome стал первым крупным браузером, который сделал эти атаки устаревшими. Это достигается путем секционирования истории :visited
ссылок.
Что такое секционирование :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 в прошлом, что приведет к утечке информации о вашей истории посещений.
Перед разделением, когда вы щелкнули ссылку:
Это будет отображаться как :visited на каждом сайте, отображающем эту ссылку!
Разделение защищает вашу историю просмотров, показывая ссылку как посещенную только в том случае, если вы уже нажимали на эту ссылку с этого сайта раньше. Если вы ранее не взаимодействовали с этим сайтом, его ссылки не будут иметь стиль :visited
.
Рассмотрим предыдущий пример, но с включенным секционированием. Вы просматриваете сайт А и нажимаете ссылку, чтобы перейти на сайт Б. Комбинация «Сайт А + Сайт Б» сохраняется в вашей истории посещений. Таким образом, когда вы посещаете Сайт Зла, его ссылка на Сайт Б не будет отображаться как :visited
, поскольку она не соответствует обеим частям нашей записи «Сайт А + Сайт Б» (контекст, в котором вы первоначально щелкнули ссылку). Поскольку на Site Evil не отображается история посещений, он не может воспользоваться никакими эксплойтами. Поэтому история вашего браузера в безопасности!
После разделения при нажатии на ссылку:
Он отображается как :visited
только там, где вы нажимали на него раньше!
Короче говоря, под секционированием подразумевается хранение ваших ссылок с дополнительной информацией о том, где по ним нажимали. В Chrome это: URL-адрес ссылки, сайт верхнего уровня и источник фрейма . При включенном секционировании ваша история :visited
больше не является глобальным списком, который может запросить любой сайт. Вместо этого ваша история :visited
«разделена» или отделена контекстом, из которого вы изначально посетили эту ссылку.
А как насчет ссылок на другие страницы того же сайта?
Просматривая Интернет, вы можете нажать на множество ссылок, которые ведут на разные подстраницы одного и того же сайта. Например, исследуя различные типы металлов, вы можете посетить страницы Site.Wiki
, посвященные «хрому» и «латуни».
При жесткой реализации секционирования пользователи на странице Site.Wiki
для золота не будут видеть ссылки на страницы Chrome и Brass, отображаемые как :visited
. Это связано с тем, что пользователь нажимал на каждую из этих страниц с сайта верхнего уровня, который не соответствует странице Site.Wiki
для золота.
Чтобы улучшить взаимодействие с пользователем в этом сценарии, сохраняя при этом конфиденциальность и безопасность секционирования, мы ввели исключение для самоссылок . Короче говоря, сайт может отображать свои собственные подстраницы как :visited
, даже если эти ссылки ранее не нажимались в этом контексте. Поскольку на сайтах есть другие методы отслеживания того, посещал ли пользователь их подстраницы, при добавлении самоссылок на эти сайты не передается никакой новой информации. Секционирование по-прежнему защищает от межсайтового отслеживания и обеспечивает соблюдение политики одного и того же источника. Но важно отметить, что это относится только к ссылкам на собственные подстраницы сайта. Это исключение не распространяется на ссылки на сторонние сайты или в сторонних iframe.
После вырезания «самосвязей»:
Статус реализации
Эти улучшения безопасности и конфиденциальности :visited
доступны начиная с Chrome версии 136. Chrome — первый браузер, реализовавший эти меры защиты для пользователей.
Привлекайте и делитесь отзывами
- Оригинальное предложение. ,
- Задавайте вопросы и участвуйте в обсуждениях.
- Сообщите об ошибке в трекере Chromium, если вы считаете, что что-то работает не так, как ожидалось.