Počítání bez souboru cookie
Počítadlo návštěv má jeden nešikovný úkol: musí od sebe rozlišit dvě návštěvy. Pokud to nedokáže, jeden člověk, který desetkrát znovu načte stránku, vypadá jako deset lidí a číslo na webu je fikce.
Obvyklým řešením je soubor cookie. Tento web ho nepoužívá. Zde je, co dělá místo toho, a proč si poctivá verze této věty vyžádala nějakou práci.
Soubor cookie, o který nikdo nežádal
Až do letošního roku každý požadavek na počítadlo spouštěl relaci PHP. Je to jeden řádek kódu, vypadá neškodně a znamenal, že každý návštěvník každého webu s počítadlem Stats4U dostal relační soubor cookie – nastavený námi, na cizí stránce, aniž by to kterákoli strana zamýšlela.
Relace se nikdy k ničemu nepoužila. Důkaz se snadno našel, jakmile se někdo podíval: adresář, kde se relace ukládají, obsahoval nula souborů. Léta nastavovala soubor cookie na cizích webech, aby uchovávala data, která se nikdy nezapsala ani nepřečetla.
Z cesty počítání zmizela. Relace se nyní spouští jen tehdy, když někdo vytváří nebo znovu nastavuje počítadlo – tedy při akci, kterou na tomto webu provedl záměrně.
Co ji nahradilo
Návštěvníci se rozlišují pomocí hashe. Vstupuje do něj pět věcí:
- IP adresa
- user agent
- číslo počítadla
- dnešní datum
- tajný klíč, který se každý den mění
Výsledkem je 16 bajtů, a ty se ukládají. Uchovávají se dva dny a pak se smažou. Samotná IP adresa se nikdy v žádném okamžiku nezapisuje.
Dvě návštěvy téhož člověka ve stejný den u stejného počítadla dají stejných 16 bajtů, takže druhá se rozpozná jako opakovaná. Zítra tentýž člověk vytvoří něco úplně jiného, protože se změnilo datum i tajný klíč. To je celý mechanismus.
Proč se tajný klíč obměňuje
Tady je snadné udělat chybu, a až do letoška tu ta chyba byla.
Stará verze používala jeden trvalý tajný klíč. Ten sice stále dával různým lidem různé hashe, což zní dobře. Znamenalo to ale, že kdokoli s tímto klíčem mohl vzít podezřelou IP adresu a přepočítat její hash pro libovolný den v archivu – a proměnit tak tabulku anonymních 16bajtových hodnot zpět v záznam o tom, kdo co navštívil, až tak daleko do minulosti, kam data sahala.
Tajný klíč se nyní mění denně a staré klíče se po dvou dnech mažou. Jakmile se to stane, výpočet už nemůže provést nikdo. To zahrnuje i provozovatele tohoto webu, a o to jde: ochrana, která závisí na dobrém chování provozovatele, není ochrana, ale slib.
Rozlišení obrazovky a poučení o mazání
Dříve se shromažďovalo rozlišení obrazovky. Je to klasický signál pro fingerprinting a nestálo za to, co stálo, a tak bylo odstraněno ze skriptu, který běží na stránce s vloženým počítadlem.
To nestačilo, a důvod stojí za to znát každému, kdo staví věci pro cizí weby. Skript se doručuje s platností mezipaměti sedm dní, takže staré kopie zůstaly v prohlížečích návštěvníků aktivní ještě týden po změně. Horší je, že některé weby na skript vůbec neodkazují – před lety si jeho kopii vložily přímo do svých stránek a tato kopie bude navždy dělat přesně to, co dělala v den vložení.
Rozlišení tedy dál přicházelo. Řešením bylo, aby hodnotu odmítal server bez ohledu na to, kdo ji posílá. Odstranění sběru dat z klienta zastaví jen nové klienty. Odstranění ze serveru ho zastaví okamžitě.
Ověření
Nic z toho nemá velkou cenu jako pouhé tvrzení, takže tady je příkaz:
- curl -sk -D - -o /dev/null 'https://www.stats4u.net/index.php?action=pic&s4uid=1' | grep -i set-cookie
Žádný výstup znamená, že nebyl nastaven žádný soubor cookie.
Na závěr jedno upozornění, stejné jako vždy: toto popisuje, co software dělá. Zda splňuje pravidla platná v konkrétní zemi, je otázka pro někoho, kdo je k odpovědi kvalifikovaný, a tohle taková odpověď není.
Aktualizace, 11. září 2026: Od 27. srpna 2026 skript znovu četl rozlišení obrazovky, šířku okna prohlížeče a poměr pixelů, a to na každém webu, který ho vložil. Od 11. září 2026 to dělá jen tam, kde to majitel webu zapne pomocí data-screen="1". Bez tohoto atributu aktuální skript nečte žádný z těchto tří údajů a server je už neukládá ani ze starších kopií.