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, jakelement.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 przypadkuspan
) 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.
Limits to visited link styles
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:
color
background-color
border-color
(and its sub-properties)column-rule-color
outline-color
- The color parts of the
fill
andstroke
attributes
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
- privacy-related changes coming to CSS :visited on Mozilla Hacks
- Plugging the CSS History Leak on the Mozilla Security Blog
- Preventing attacks on a user's history through CSS :visited selectors