Prywatność i znacznik :visited

Przed mniej więcej rokiem 2010, CSS-owy znacznik :visited pozwalał stronom WWW na ujawnianie historii przeglądania użytkownika i które ze stron odwiedził. Było to możliwe przez window.getComputedStyle i inne techniki. Proces ten działał błyskawicznie i pozwalał nie tylko na ujawnienie, co użytkownik robił w sieci, ale również pozwalał na dowiedzenie się wielu informacji o jego tożsamości.

By załagodzić ten problem, w Gecko 2 zaimplementowano aktualizacje dot. prywatności celem ograniczenia ilości informacji zbieranych przez odwiedzone linki. W przypadku innych przeglądarek dokonano podobnych zmian.

Małe, białe kłamstewka

By chronić prywatność użytkowników, Firefox i inne przeglądarki będą kłamać aplikacjom webowym w przypadku zaistnienia poniższych okoliczności:

  • Metoda window.getComputedStyle i podobne funkcje, jak element.querySelector zawsze zwrócą wartości wykazujące, jakoby użytkownik nigdy nie odwiedził żadnego z linku danej strony.
  • Jeśli użyjesz selektora rodzeństwa, jak :visited + span, element sąsiedni (w omawianym przypadku span) zostanie ostylowany w sposób właściwy dla linka nieodwiedzonego.
  • W rzadkich przypadkach, jeśli zastosujesz zagnieżdżone elementy linków i okaże się, że dobrany element jest inny, niż link, którego obecność w historii jest testowana, element zostanie wyrenderowany również, jakby nigdy nie był wcześniej odwiedzany.

You can style visited links, but there are limits to which styles you can use. Only the following styles can be applied to visited links:

In addition, even for the above styles, you won't be able to change the transparency between unvisited and visited links, as you otherwise would be able to using rgba(), hsla(), or the transparent keyword.

Here is an example of how to use styles with the aforementioned restrictions:

:link {
  outline: 1px dotted blue;
  background-color: white;
  /* The default value of background-color is `transparent`. You need to
     specify a different value, otherwise changes on :visited won't apply. */
}

:visited {
  outline-color: orange;    /* Visited links have an orange outline */
  background-color: green;  /* Visited links have a green background */
  color: yellow;            /* Visited links have yellow colored text */
}

Impact on web developers

Overall, these restrictions shouldn't affect web developers too significantly. They may, however, require the following changes to existing sites:

  • Using background images to style links based on whether they've been visited will no longer work, since only colors can be used to style visited links.
  • Colors that are otherwise transparent will fail to appear if styled in a :visited selector.

See also