Contact met ondersteuning

Wij antwoorden per e-mail, meestal binnen twee dagen.

Google reCAPTCHA controleert deze inzending op misbruik; daarbij worden gegevens naar Google gestuurd. Het script laadt pas wanneer dit formulier wordt geopend.

← Alle berichten

Tellen zonder cookie

Een bezoekersteller heeft één lastige taak: hij moet twee bezoeken uit elkaar houden. Kan hij dat niet, dan lijkt één persoon die een pagina tien keer herlaadt op tien mensen, en is het getal op de site verzonnen.

De gebruikelijke oplossing is een cookie. Deze site gebruikt er geen. Hier staat wat hij in plaats daarvan doet, en waarom de eerlijke versie van die zin enig werk heeft gekost.

Het cookie waar niemand om vroeg

Tot dit jaar begon elke aanvraag aan de teller een PHP-sessie. Dat is één regel code, het ziet er onschuldig uit, en het betekende dat elke bezoeker van elke site met een Stats4U-teller een sessiecookie kreeg — door ons gezet, op andermans pagina, zonder dat een van beide partijen dat wilde.

de ingrediëntenIP · UA · IDdatum · dagzouthash16 bytesbewaard2 dagenhet adres zelf wordt nooit opgeschrevenis het zout weg, dan kan niemand een dag nog narekenen — ook wij niet

De sessie is nooit ergens voor gebruikt. Het bewijs was zo gevonden zodra iemand keek: de map waarin sessies worden bewaard, bevatte nul bestanden. Ze had jarenlang een cookie op andermans websites gezet om gegevens vast te houden die nooit werden geschreven en nooit werden gelezen.

Ze is uit het telpad verdwenen. Een sessie begint nu alleen wanneer iemand een teller aanmaakt of opnieuw instelt — een handeling die diegene bewust verrichtte, op deze site.

Wat ervoor in de plaats kwam

Bezoekers worden uit elkaar gehouden met een hash. Er gaan vijf dingen in:

  • het IP-adres
  • de user agent
  • het tellernummer
  • de datum van vandaag
  • een geheim dat elke dag verandert

Eruit komen 16 bytes, en dat is wat er wordt opgeslagen. Het blijft twee dagen bewaard en wordt dan gewist. Het IP-adres zelf wordt nergens opgeschreven.

Twee bezoeken van dezelfde persoon op dezelfde dag aan dezelfde teller leveren dezelfde 16 bytes op, dus het tweede wordt als herhaling herkend. Morgen levert diezelfde persoon iets volstrekt anders op, omdat zowel de datum als het geheim veranderd zijn. Dat is het hele mechanisme.

Waarom het geheim wisselt

Dit is het deel dat makkelijk misgaat, en hier ging het mis tot dit jaar.

De oude versie gebruikte één vast geheim. Dat leverde nog steeds verschillende hashes voor verschillende mensen op, wat prima klinkt. Maar het betekende dat iedereen die dat geheim had, een verdacht IP-adres kon nemen en de hash ervan kon narekenen voor elke dag in het archief — waarmee een tabel met anonieme waarden van 16 bytes weer een verslag werd van wie wat bezocht, zo ver terug als de gegevens reikten.

Het geheim verandert nu dagelijks en de oude worden na twee dagen gewist. Is dat eenmaal gebeurd, dan is de berekening niet meer uit te voeren, door niemand. Ook niet door wie deze site beheert, en dat is juist de bedoeling: een bescherming die afhangt van het goede gedrag van de beheerder is geen bescherming, maar een belofte.

De schermresolutie, en een les over dingen weghalen

De schermresolutie werd vroeger verzameld. Het is een klassiek fingerprinting-signaal en het was niet waard wat het kostte, dus is het uit het script gehaald dat op de insluitende pagina draait.

Dat was niet genoeg, en de reden is het weten waard voor iedereen die dingen bouwt voor andermans websites. Het script wordt uitgeleverd met een cachetijd van zeven dagen, dus oude kopieën bleven na de wijziging nog een week in de browsers van bezoekers draaien. Erger nog: sommige sites verwijzen helemaal niet naar het script — ze hebben er jaren geleden een kopie van in hun eigen pagina's geplakt, en die kopie zal voor altijd precies blijven doen wat ze deed op de dag dat ze geplakt werd.

Dus bleef de resolutie binnenkomen. De oplossing was om de server de waarde te laten weigeren, wie hem ook stuurt. Een gegevensverzameling uit de client halen stopt alleen nieuwe clients. Ze uit de server halen stopt het meteen.

Zelf nakijken

Als bewering is dit alles niet veel waard, dus hier staat het commando:

  • curl -sk -D - -o /dev/null 'https://www.stats4u.net/index.php?action=pic&s4uid=1' | grep -i set-cookie

Geen uitvoer betekent dat er geen cookie is gezet.

Tot slot dezelfde waarschuwing als altijd: dit beschrijft wat de software doet. Of dat voldoet aan de regels die in een bepaald land gelden, is een vraag voor iemand die daar bevoegd voor is, en dit is dat antwoord niet.

Advertentie