Pull to refresh

Comments 28

Неужели в CSS нет более интересных и часто встречаемых проблем, о которых можно написать статью? Grid? Flex?

В каких ситуациях вообще может понадобится менять размер посещенной ссылки? Это сделает UI менее постоянным, вследствии чего ухудшится UX

Если очень нужно, JS как всегда приходит на помощь в подобных ситуациях:

<a 
  href="https://habr.com/" 
  target="_blank" 
  onclick="this.classList.add('visited-link')"
>link text
</a>


.visited-link {
  font-size: 35px;
}
В вашем примере размер шрифта изменится при клике по ссылке, а это не означает, что она была посещена. При обновлении страницы стили не сохранятся. При переходе по этой ссылке с другого источника также результата не будет.

По мне так знания о непрямых атаках развивают мышление. Заставляют задумываться о последствиях казалось бы безобидных решений.
Помимо того, что нельзя изменить размер шрифта, нельзя изменить и сам шрифт и его начертание и много чего ещё, что имело бы смысл в дизайне.

Вы, видимо, не поняли, тут рассказывается не о проблеме стилизации а о безопасности.
«В каких ситуациях» — в ситуации когда злоумышленник хочет узнать какие сайты вы посещаете.
Если бы эта уязвимость работала, злоумышленник мог бы разместить на своём сайте 100500 ссылок, которые хочет проверить, и мог бы увидеть какие ссылки у посетителей отмечались бы другим цветом или размером.
JS вам в этом никак не поможет.
Собственно, когда уязвимость существовала, так и делали.
Неужели в CSS нет более интересных и часто встречаемых проблем, о которых можно написать статью? Grid? Flex?

В CSS, как кажется, порой проблем больше, чем решений. И уж про Grid, Flex, а также про много других подходов писали, и не раз, или я не прав? Но почему бы на Хабре (где вообще пишут обо всем, за уши притягивая тему к словам «ит» и «гик», как в том анекдоте про рыбу и блох) не описать такую вот тему, тем более что она, и правда, имеет очень интересную причину — я про откровенно, как кажется, нелогичное поведение браузера, идущее не от бага, а от логики безопасности? И лично мне, кстати, было очень интересно узнать об этом поведении, поскольку проблему, которую оно решает, я как раз считаю очень серьезной.
Что-то я не понял, если скрипт может выполнить `getComputedStyle`, то он может и навесить `onclick` на все ссылки, в чем состоит защита в этом случае?

PS: нашел ответ на reddit, без защиты сторонний скрипт мог бы нарисовать невидимый блок с тысячами ссылок и проверить были ли они посещены или нет.

Вы не переходили на какую-либо страницу с текущей. Вы посещали ее когда-то давно, но браузер меняет стиль на :visited.



Я вижу это так:


Можно сделать вывод, что я посещал главную Хабра и Ютуба когда-то. Хотя я не нажимал непосредственно на эти ссылки сейчас, обработчик бы не сработал.

У меня не подсветился habr.com, хотя я на habr.com прямо сейчас о_О
image
А почему нельзя делать скрин ссылки, и проверять цвет по конкретной точке? Можно самому воткнуть стиль для посещенных ссылок, за футером помещать интересующие ссылки, и смотреть цвет пикселя

Попробовал только что поиграться с html2canvas.js — браузер не отдает в читаемый канвас свойства псевдоэлемента :visited.

html2canvas не делает скриншот, а рендерит страницу с нуля, используя данные из HTML и CSS кода. Поэтому на него действует защаита, встроенная в getComputedStyle.

Потому-что нет встроенных средств сделать скриншоты по причине безопасности
В Chrome есть дыра через которую можно узнать состояние :visited. Почти год прошел с тех пор как был открыт Issue но команда Chrome не торопится его закрывать.
А вот оно где. Я до этого не дошел, через час надоело. Можно еще порыться в направлении свойств дочерних/соседних элементов: а:visited [selector]
Описанный способ так же работает и в последней версии ФФ — можно скачать attack.html из того issue, и попробовать.
А разве нельзя на a:visited повешать еще что-то типа display:none, и проверять уже дальше, что элемент вообще видимый?
Display не входит в список разрешённых для :visited свойств, поэтому браузер просто проигнорирует свойство
Allowable CSS properties are color, background-color, border-color, border-bottom-color, border-left-color, border-right-color, border-top-color, column-rule-color, and outline-color.
UFO just landed and posted this here

Именно так, «изоляцией Ржевского в гусарской балладе», собираются решать проблему посещенных ссылок в будущем. Но пока уже много лет есть существующее решение, браузеры стремятся хотя бы его поддерживать единообразно. И в этом, имхо, правы.


А отправлять на сервер небезопасные данные через CSS, конечно, незачем, но не всегда вас об этом спрашивают..;)

UFO just landed and posted this here
плохая метафора как кот с дверью
Какое же облегчение чувствуешь, читая такие строки. Даже на таком уровне используют костыли. Фух, я не один такой!
Весь веб — это много много костылей, чтобы просто показать пользователям некое изображение (в виде текста, картинок или видео).
Для меня не менее интересным открытием стал запрет на использование CSS переменных внутри :visited в Хроме. А вот в FireFox это не запрещено.
Sign up to leave a comment.

Articles