28 november 2007
Met CSS kunnen bezochte links in een web browser afwijkend worden gestijld. Vanuit usability-oogpunt is dit handig, een uitkomst zelfs. Maar het brengt een groot privacy-risico met zich mee.
Een mix van DOM, CSS en Javascript
De DOM-API beschrijft de functie getComputedStyle. Hiermee kan stijlinformatie van HTML-elementen worden opgevraagd. Door bezochte links afwijkend te stijlen, kan onderscheid gemaakt worden tussen bezochte en niet bezochte URI's.
Er is wel een aantal voorwaarden waar de web browser aan moet voldoen.
-
getComputedStylewordt ondersteund (onderdeel van DOM Level 2 Style Specification) - Een lijst met bezochte URI's wordt bijgehouden
-
a:visitedwordt ondersteund - Javascript moet aan staan
Alle moderne browsers voldoen aan de eerste drie voorwaarden, en verreweg de meeste gebruiker hebben Javascript aan staan.
Voorbeeld-code
Onderstaande code is getest in Firefox 2.0.0.8 en Internet Explorer 6.0. Internet Explorer ondersteunt document.defaultView niet. Dit is in de demo dan ook vervangen door element.currentStyle[property].
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>I know where you've been</title>
<style type="text/css">
a { color: rgb(255,0,0) }
a:visited { color: rgb(0,255,0) }
</style>
<h1>I know where you've been</h1>
<ul>
<li><a href="https://mail.google.com/">Gmail</a>
<li><a href="http://www.truecrypt.org/">TrueCrypt</a>
<li><a href="http://sex.com/">Sex.com</a>
</ul>
<script type="text/javascript">
links = document.getElementsByTagName('a)
for (i=0; i<links.length; i++)
{
color = document.defaultView.getComputedStyle(links[i], null)['color']
if (color == 'rgb(0, 255, 0)')
alert('You visited ' + links[i].href)
}
</script>
Kanttekeningen
Ondanks het gemak waarmee bezochte URI's kunnen worden vrijgegeven, zijn de risico's beperkt.
Het is niet mogelijk een lijst met bezochte URI's op te vragen; slechts vooraf gedefinieerde URI's kunnen worden gecontroleerd. Ook moet het slachtoffer een pagina in beheer van de aanvaller bezoeken, of een pagina waarop de aanvaller Javascript kan laten uitvoeren. Met het groeiend gebruik van social networking is dat niet ondenkbaar.
Test het uit
Druk om onderstaande knop om te zien welke onderdelen van mijn website u reeds bezocht heeft.