Numărare fără cookie
Un contor de vizitatori are o sarcină incomodă: trebuie să deosebească două vizite. Dacă nu poate, atunci o persoană care reîncarcă o pagină de zece ori arată ca zece persoane, iar numărul de pe site este ficțiune.
Soluția obișnuită este un cookie. Acest site nu folosește așa ceva. Iată ce face în schimb și de ce a fost nevoie de ceva muncă până când această propoziție a putut fi spusă cu sinceritate.
Cookie-ul pe care nu l-a cerut nimeni
Până anul acesta, fiecare cerere către contor pornea o sesiune PHP. Este o singură linie de cod, pare inofensivă și însemna că fiecare vizitator al fiecărui site care folosea un contor Stats4U primea un cookie de sesiune — setat de noi, pe pagina altcuiva, fără ca vreuna dintre părți să intenționeze asta.
Sesiunea nu a fost folosită niciodată pentru nimic. Dovada a fost ușor de găsit odată ce s-a uitat cineva: directorul în care sunt stocate sesiunile conținea zero fișiere. Ani la rând, setase un cookie pe site-urile altor oameni, pentru a păstra date care nu au fost niciodată scrise și niciodată citite.
A dispărut de pe calea de numărare. O sesiune pornește acum doar când cineva creează sau reconfigurează un contor — o acțiune pe care a făcut-o în mod deliberat, pe acest site.
Ce l-a înlocuit
Vizitatorii sunt deosebiți printr-un hash. În el intră cinci lucruri:
- adresa IP
- user agent-ul
- ID-ul contorului
- data de azi
- un secret care se schimbă în fiecare zi
Rezultă 16 octeți, iar aceștia sunt stocați. Se păstrează două zile, apoi sunt șterși. Adresa IP în sine nu este stocată în niciun moment.
Două vizite ale aceleiași persoane, în aceeași zi, la același contor produc aceiași 16 octeți, deci a doua este recunoscută ca repetare. Mâine, aceeași persoană produce ceva complet diferit, pentru că s-au schimbat atât data, cât și secretul. Acesta este tot mecanismul.
De ce se schimbă secretul
Aceasta este partea la care e ușor de greșit, iar aici a fost greșită până anul acesta.
Versiunea veche folosea un singur secret permanent. Acesta producea în continuare hash-uri diferite pentru persoane diferite, ceea ce pare în regulă. Dar însemna că oricine deținea acel secret putea lua o adresă IP bănuită și îi putea recalcula hash-ul pentru orice zi din arhivă — transformând un tabel de valori anonime de 16 octeți înapoi într-o evidență a cine ce a vizitat, până unde ajungeau datele în trecut.
Secretul se schimbă acum zilnic, iar cele vechi sunt șterse după două zile. Odată ce s-a întâmplat asta, calculul nu mai poate fi efectuat, de nimeni. Asta îl include și pe cel care administrează acest site, și exact acesta este scopul: o protecție care depinde de buna purtare a operatorului nu este o protecție, ci o promisiune.
Rezoluția ecranului și o lecție despre ștergere
Rezoluția ecranului era colectată înainte. Este un semnal clasic de fingerprinting și nu merita costul, așa că a fost scoasă din scriptul care rulează pe pagina ce încorporează contorul.
Nu a fost de ajuns, iar motivul merită știut de oricine construiește lucruri pentru site-urile altora. Scriptul este livrat cu o durată de cache de șapte zile, așa că copiile vechi au rămas active în browserele vizitatorilor încă o săptămână după modificare. Mai rău, unele site-uri nu trimit deloc la script — au lipit o copie a lui în propriile pagini cu ani în urmă, iar acea copie va continua să facă exact ce făcea în ziua în care a fost lipită, pentru totdeauna.
Așa că rezoluția a continuat să sosească. Soluția a fost ca serverul să refuze valoarea, indiferent cine o trimite. Eliminarea unei colectări de date din client oprește doar clienții noi. Eliminarea ei de pe server o oprește imediat.
Verificare
Nimic din toate acestea nu valorează mult ca simplă afirmație, așa că iată comanda:
- curl -sk -D - -o /dev/null 'https://www.stats4u.net/index.php?action=pic&s4uid=1' | grep -i set-cookie
Dacă nu apare nimic, nu a fost setat niciun cookie.
O ultimă precauție, aceeași ca întotdeauna: aici este descris ce face software-ul. Dacă acest lucru respectă regulile aplicabile într-o anumită țară este o întrebare pentru cineva calificat să răspundă, iar acesta nu este acel răspuns.