Számlálás süti nélkül
Egy látogatószámlálónak van egy kényes feladata: meg kell tudnia különböztetni két látogatást. Ha erre nem képes, akkor egy ember, aki tízszer tölt újra egy oldalt, tíz embernek látszik, és a weboldalon látható szám puszta kitaláció.
A szokásos megoldás egy süti. Ez a weboldal nem használ ilyet. Az alábbiakban leírjuk, mit tesz helyette, és azt is, miért kellett megdolgozni azért, hogy ez a mondat valóban igaz legyen.
A süti, amelyet senki sem kért
Az idei évig minden, a számlálóhoz érkező kérés PHP-munkamenetet indított. Ez egyetlen kódsor, ártalmatlannak tűnik, és azt jelentette, hogy minden Stats4U-számlálót használó weboldal minden látogatója munkamenet-sütit kapott – mi állítottuk be, valaki más oldalán, anélkül, hogy ezt bármelyik fél szándékozta volna.
A munkamenetet soha semmire nem használták. A bizonyítékot könnyű volt megtalálni, amint valaki utánanézett: abban a könyvtárban, ahol a munkamenetek tárolódnak, egyetlen fájl sem volt. Évek óta sütit állított be mások weboldalain olyan adatok tárolására, amelyeket soha senki nem írt és nem olvasott.
A számlálási útvonalról eltűnt. Munkamenet ma már csak akkor indul, ha valaki számlálót hoz létre vagy állít be újra – vagyis olyan műveletet végez, amelyet szándékosan, ezen a weboldalon hajt végre.
Mi lépett a helyébe
A látogatókat egy hash különbözteti meg egymástól. Öt dolog kerül bele:
- az IP-cím
- a böngészőazonosító (user agent)
- a számlálóazonosító
- a mai dátum
- egy titkos érték, amely naponta változik
Az eredmény 16 bájt, és csak ezt tároljuk. Két napig őrizzük meg, aztán töröljük. Magát az IP-címet egyetlen ponton sem rögzítjük.
Ha ugyanaz a személy ugyanazon a napon kétszer keresi fel ugyanazt a számlálót, ugyanaz a 16 bájt keletkezik, így a rendszer a második látogatást ismétlésként ismeri fel. Másnap ugyanabból a személyből egészen más érték lesz, mert a dátum és a titkos érték is megváltozott. Ez az egész mechanizmus.
Miért változik a titkos érték
Ezt a részt könnyű elrontani, és itt is hibás volt egészen idén.
A régi változat egyetlen állandó titkos értéket használt. Ez is különböző hash-eket adott különböző emberekre, ami rendben lévőnek hangzik. Csakhogy ez azt jelentette, hogy aki birtokolta ezt a titkos értéket, az egy gyanított IP-cím hash-ét újra kiszámíthatta az archívum bármelyik napjára – és így a névtelen 16 bájtos értékek táblázatát visszaalakíthatta annak nyilvántartásává, ki mit látogatott meg, egészen addig visszamenőleg, ameddig az adatok visszanyúltak.
A titkos érték most naponta változik, a régieket pedig két nap után töröljük. Ezt követően a számítást többé senki sem tudja elvégezni. Ez arra is vonatkozik, aki ezt a weboldalt üzemelteti, és éppen ez a lényeg: az a védelem, amely az üzemeltető jó viselkedésén múlik, nem védelem, hanem ígéret.
A képernyőfelbontás, és egy tanulság a törlésről
A képernyőfelbontást korábban gyűjtöttük. Ez klasszikus ujjlenyomat-jel (fingerprinting), és nem érte meg, amibe került, ezért kivettük abból a szkriptből, amely a beágyazó oldalon fut.
Ez nem volt elég, és az okát érdemes ismernie mindenkinek, aki mások weboldalai számára készít valamit. A szkriptet hétnapos gyorsítótár-élettartammal szolgáljuk ki, így a régi példányok a változás után még egy hétig működtek a látogatók böngészőiben. Ennél is rosszabb, hogy egyes weboldalak egyáltalán nem hivatkoznak a szkriptre – évekkel ezelőtt bemásolták egy példányát a saját oldalaikba, és ez a példány örökké pontosan azt fogja csinálni, amit a bemásolás napján.
A felbontás tehát továbbra is érkezett. A megoldás az volt, hogy a szerver utasítsa el az értéket, függetlenül attól, ki küldi. Ha egy adatgyűjtést a kliensből távolítunk el, az csak az új klienseket állítja meg. Ha a szerverből, akkor azonnal megszűnik.
Ellenőrzés
Mindez puszta állításként nem sokat ér, ezért íme a parancs:
- curl -sk -D - -o /dev/null 'https://www.stats4u.net/index.php?action=pic&s4uid=1' | grep -i set-cookie
Ha nincs kimenet, nem jött létre süti.
Egy záró figyelmeztetés, ugyanaz, mint mindig: ez azt írja le, mit csinál a szoftver. Hogy ez megfelel-e az adott országban érvényes szabályoknak, arra egy szakképzett személynek kell választ adnia, és ez a szöveg nem az a válasz.
Frissítés (2026. szeptember 11.): 2026. augusztus 27-től a szkript ismét kiolvasta a képernyőfelbontást, a böngészőablak szélességét és a pixelarányt minden weboldalon, amely beágyazta. 2026. szeptember 11. óta ezt csak ott teszi, ahol a weboldal tulajdonosa a következővel bekapcsolja: data-screen="1". Ennek az attribútumnak a hiányában a jelenlegi szkript a három érték egyikét sem olvassa ki, és a szerver a régebbi példányokból érkező értékeket sem tárolja többé.