Подсчёт без файлов cookie
У счётчика посетителей есть одна неудобная задача: он должен отличать один визит от другого. Если он не может этого сделать, один человек, перезагрузивший страницу десять раз, выглядит как десять человек, а число на сайте — вымысел.
Обычное решение — файл cookie. Этот сайт его не использует. Вот что используется вместо этого — и почему честная версия этой фразы потребовала некоторых усилий.
Файл cookie, о котором никто не просил
До этого года каждый запрос к счётчику запускал PHP-сессию. Это одна строка кода, она выглядит безобидно, но означала, что каждый посетитель каждого сайта со счётчиком Stats4U получал файл cookie сессии — который устанавливали мы, на чужой странице, и ни одна из сторон этого не хотела.
Эта сессия никогда ни для чего не использовалась. Доказательство нашлось легко, стоило только посмотреть: в каталоге, где хранятся сессии, не было ни одного файла. Годами он устанавливал файл cookie на чужих сайтах, чтобы хранить данные, которые никогда не записывались и никогда не читались.
Из пути подсчёта это убрано. Теперь сессия запускается только тогда, когда кто-то создаёт или перенастраивает счётчик — то есть совершает осознанное действие на этом сайте.
Что пришло на смену
Посетителей различают по хешу. В него входят пять составляющих:
- IP-адрес
- User-Agent
- идентификатор счётчика
- сегодняшняя дата
- секрет, который меняется каждый день
На выходе получается 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
Если ничего не выведено, значит, файл cookie не был установлен.
Последнее предупреждение, как всегда одно и то же: здесь описано, что делает программа. А удовлетворяет ли это нормам, которые действуют в конкретной стране, — вопрос для того, кто уполномочен на него отвечать, и это не тот ответ.
Обновление от 11.09.2026: С 27.08.2026 скрипт снова считывал разрешение экрана, ширину окна браузера и коэффициент пикселей на каждом сайте, который его встраивал. С 11.09.2026 он делает это только там, где владелец сайта включает такое считывание с помощью data-screen="1". Без этого атрибута текущий скрипт не считывает ни одного из трёх значений, а сервер больше не сохраняет их и из более старых копий скрипта.