Отчитане без бисквитка
Броячът на посетители има една неудобна задача: трябва да различава две посещения. Ако не може, един човек, презаредил страницата десет пъти, изглежда като десет души, а числото в сайта е измислица.
Обичайното решение е бисквитка. Този сайт не използва такава. Ето какво прави вместо това – и защо честната версия на това изречение изискваше известна работа.
Бисквитката, която никой не беше поискал
До тази година всяка заявка към брояча стартираше PHP сесия. Това е един ред код, изглежда безобидно и означаваше, че всеки посетител на всеки сайт с брояч на Stats4U получаваше бисквитка за сесия – зададена от нас, на чужда страница, без никоя от двете страни да го е искала.
Сесията никога не е била използвана за нищо. Доказателството беше лесно за намиране, щом някой погледна: директорията, в която се съхраняват сесиите, съдържаше нула файла. Години наред сесията задаваше бисквитка в чужди уебсайтове, за да съхранява данни, които никога не бяха записвани и никога не бяха четени.
Тя е премахната от процеса на отчитане. Сесия вече се стартира само когато някой създава или преконфигурира брояч – действие, което предприема съзнателно, в този сайт.
Какво я замени
Посетителите се разграничават чрез хеш. В него влизат пет неща:
- IP адресът
- потребителският агент
- ID на брояча
- днешната дата
- тайна, която се сменя всеки ден
Излизат 16 байта – и именно те се съхраняват. Пазят се два дни и след това се изтриват. Самият IP адрес никога не се записва в нито един момент.
Две посещения от един и същ човек в един и същ ден към един и същ брояч дават едни и същи 16 байта, така че второто се разпознава като повторно. Утре същият човек дава нещо съвсем различно, защото и датата, и тайната са се сменили. Това е целият механизъм.
Защо тайната се сменя
Това е частта, в която е лесно да се сгреши – и тук беше сгрешено до тази година.
Старата версия използваше една постоянна тайна. Това пак даваше различни хешове за различни хора, което звучи добре. Но означаваше, че всеки, който притежава тази тайна, може да вземе заподозрян IP адрес и да изчисли отново неговия хеш за всеки ден в архива – превръщайки таблица с анонимни 16-байтови стойности обратно в запис кой какво е посетил, чак до най-старите данни.
Сега тайната се сменя всеки ден, а старите се изтриват след два дни. След като това стане, изчислението вече не може да бъде извършено от никого. Това включва и този, който управлява този сайт, и точно това е смисълът: защита, която зависи от доброто поведение на оператора, не е защита, а обещание.
Резолюцията на екрана и един урок за изтриването
Преди се събираше резолюцията на екрана. Това е класически сигнал за идентифициране по цифров отпечатък и не си струваше цената, затова беше премахната от скрипта, който се изпълнява на страницата с вградения брояч.
Това не беше достатъчно и причината си струва да я знае всеки, който създава неща за чужди уебсайтове. Скриптът се доставя със срок на кеширане от седем дни, така че старите копия останаха активни в браузърите на посетителите цяла седмица след промяната. Още по-лошо, някои сайтове изобщо не зареждат скрипта чрез връзка – преди години те са поставили негово копие в собствените си страници и това копие ще продължи да прави точно това, което е правело в деня на поставянето, завинаги.
Така резолюцията продължи да пристига. Решението беше сървърът да отказва стойността, независимо кой я изпраща. Премахването на събиране на данни от клиента спира само новите клиенти. Премахването му от сървъра го спира веднага.
Проверка
Нищо от това не струва много като твърдение, затова ето командата:
- curl -sk -D - -o /dev/null 'https://www.stats4u.net/index.php?action=pic&s4uid=1' | grep -i set-cookie
Липсата на изход означава, че не е зададена бисквитка.
Едно последно предупреждение, същото като винаги: това описва какво прави софтуерът. Дали това отговаря на правилата, приложими в дадена държава, е въпрос към някой, който е компетентен да отговори, и това тук не е този отговор.