~/politika
Обработка данных
Коротко
Здесь описано, что делает код этого сайта, и страница меняется вместе с ним. Это не договор и не форма согласия по всем правилам: назначенного оператора, сроков хранения и обещаний «удалим по запросу» тут нет, потому что в коде их тоже нет.
Единственное место, где данные уходят третьей стороне сами по себе, — счётчики посещаемости. Без вашего согласия они не загружаются.
Счётчики посещаемости
Сайт умеет подключать Яндекс.Метрику и Google Analytics 4. Каждый включается отдельно настройкой на сервере. Сейчас подключены оба.
Пока согласия нет, счётчиков нет совсем: ни запроса к mc.yandex.ru или googletagmanager.com, ни предзагрузки их скриптов, ни строчки их кода в разметке страницы. Состояние по умолчанию — «согласия нет».
С согласия счётчикам уходит просмотр страницы, и в нём:
- путь страницы и строка запроса — например,
/instrumenty?page=2; - всё остальное, что счётчик собирает о посетителе сам: адрес, браузер, разрешение экрана, ссылающуюся страницу. Этот список задаёт не сайт, а Яндекс и Google.
Часть адреса после # отрезается намеренно: по ней на сайте ездят якоря заголовков. Просмотр отправляется в том числе при переходах без перезагрузки: код сайта делает это сам, потому что счётчики о таких переходах не узнают.
Отдельно и честно: на странице поиска адрес имеет вид /poisk?q=…, значит поисковый запрос попадает в отчёты счётчиков вместе с адресом.
Кроме просмотра Метрика отправляет то, что включено её настройками, а они заданы в коде поимённо. Их четыре, и три из них — это обращения сверх просмотра:
clickmap— карта кликов: счётчик собирает координаты нажатий на странице, и в отчёте «Карта кликов» видно, куда именно вы нажимали;trackLinks— отслеживание ссылок: на клик по внешней ссылке и на скачивание файла счётчик сам шлёт отдельное обращение с адресом перехода. Такие ссылки на сайте есть: кнопки «Поделиться» в конце записи ведут наt.meиvk.com;accurateTrackBounce— ещё одно обращение через 15 секунд, чтобы короткий визит не считался отказом;defer— единственная из четырёх, которая ничего не отправляет: она отключает автоматический просмотр, его шлёт код сайта.
У Google Analytics в коде задано одно — send_page_view: false: просмотр тоже отправляет код сайта. Но «расширенная статистика» GA4 (прокрутка, клики по внешним ссылкам, поиск по сайту, скачивания) включается в настройках свойства, а не кодом, и этим флагом не отменяется. Что из неё включено, видно в самом GA4 — по коду сайта этого не узнать.
Вебвизор выключен — запись сессий не ведётся: ни движений мыши, ни нажатий клавиш, ни содержимого полей ввода никуда не уходит. Координаты самих нажатий всё же уходят — это карта кликов выше, и это всё, что счётчик знает о ваших действиях на странице.
Куки ставят сами скрипты Яндекса и Google. Их имена и сроки задаёт не этот сайт, поэтому перечислять их здесь значило бы обещать то, что по коду не проверить.
Без JavaScript счётчиков нет вовсе. Запасной картинки Метрики для такого случая на сайте нет намеренно: она сработала бы без единой строчки кода, то есть ровно у того читателя, которому нечем возразить.
Согласие
Спрашивает баннер внизу страницы, с двумя кнопками. Пока кнопку не нажали, счётчики не грузятся; отказ запоминается так же, как согласие, и баннер больше не показывается.
Решение хранится в localStorage под ключом analytics, значения yes и no. Не в куке: своих кук сайт не ставит вовсе. Если хранилище недоступно (приватное окно, запрещённые данные сайта), решение действует до конца загрузки страницы, но не запоминается — и баннер появится снова.
Передумать можно в любой момент, здесь же. Отказ от уже работающего счётчика удаляет куки с именами на _ym и _ga и перезагружает страницу: убрать поднятый счётчик из памяти вкладки иначе нечем. Если какая-то кука не удалилась — её уберёт очистка данных сайта в браузере, но запросов к счётчику после перезагрузки всё равно больше нет.
Решение одно на браузер, а не на вкладку. Поменяли его в одной — остальные подхватят сами, и те, где счётчик уже работал, перезагрузятся: иначе он продолжил бы там работать и при первом же обращении поставил бы свои куки заново, отменив отказ.
Что сайт считает сам
В своей базе сайт держит два счётчика, и оба — просто числа.
- По записи: номер записи, число просмотров, сумма оценок и число голосов, дата появления строки и дата последнего её изменения.
- По инструменту: машинное имя инструмента, число открытий, дата появления строки и дата последнего её изменения.
Это увеличение числа, а не строка на событие: ни адреса, ни браузера, ни ссылающейся страницы, ни времени каждого просмотра там нет. Времени в строке два, и оба — про саму строку: когда её завели и когда последний раз меняли. Восстановить по этому, кто и когда что читал, нельзя. Оценка записи — целое от 1 до 5, и она складывается в общую сумму: отдельным голосом она нигде не хранится.
Согласия на эти два счётчика сайт не спрашивает: в них нет ни признака читателя, ни передачи данных наружу. Согласие спрашивают там, где данные уходят третьей стороне.
IP-адрес
Код сайта пользуется адресом, с которого пришёл запрос, ровно в двух местах. Есть и третье, до всякого кода, — о нём в конце раздела.
- Ограничитель частоты. В оперативной памяти процесса лежит ключ вида
view:<номер записи>:<адрес>илиrate:<номер записи>:<адрес>— то есть «с этого адреса запись №42 уже читали» и «уже оценили». Окно: минута у просмотра записи и открытия инструмента, сутки у оценки, три секунды у сетевых инструментов. Так счётчик нельзя накрутить циклом из консоли браузера. - «Мой IP». Там адрес и есть ответ, и уходит он двоим. Страну, город и автономную систему из самого адреса не достать — за ними адрес отправляется поставщику геоданных, по умолчанию
ipinfo.io. Обратное имя (PTR), по которому нередко опознаётся линия провайдера, спрашивается у сервера имён, настроенного на сервере сайта, — это ещё один получатель адреса. Служебные диапазоны (10/8,192.168/16,fc00::/7и прочие) не отправляются никуда: ни поставщику геоданных, ни серверу имён. Ответ кладётся в тот же кеш, что у остальных сетевых инструментов, и ключ там — сам адрес; про срок — ниже, в разделе про инструменты.
В базу адрес не попадает. Истёкший ключ ограничителя перестаёт что-либо ограничивать сразу, но из памяти сам не пропадает: карта чистится, только когда дорастает до 5000 ключей, а при небольшой посещаемости она до этого и не дорастает. Значит, связка «этот адрес читал запись №42» лежит в памяти процесса до перезапуска приложения — перезапуск стирает всю карту сразу.
Своего журнала запросов приложение не ведёт, но одно ведётся до него. Перед приложением стоит обратный прокси (Nginx), и журнал доступа у него включён по умолчанию: туда на каждый запрос пишется адрес, время и запрошенный путь — в том числе /poisk?q=… и адрес подсказок поиска /api/posts/search/<набранное>. Сколько эти строки хранятся, решает ротация логов на сервере, а не код сайта.
Что хранится в браузере
localStorage:theme— выбранная тема,analytics— решение о счётчиках,rated:<номер>— своя оценка записи, чтобы не голосовать дважды.sessionStorage(живёт до закрытия вкладки):viewed:<номер>— просмотр записи уже засчитан,tool-open:<имя>— открытие инструмента уже засчитано,analytics-reload— страницу перезагрузили из-за отказа от счётчиков, чтобы после загрузки объяснить это вслух; читается и стирается сразу.
Своих кук сайт не ставит. Всё перечисленное — отметки для самого браузера, на сервер они не отправляются и чистятся очисткой данных сайта.
Инструменты
Восемь из двенадцати инструментов считают целиком в браузере, и оговорка напечатана на странице каждого из восьми. У четырёх она общая: «Всё, что вы вводите, считается прямо на этой странице: на сервер ничего не уходит и нигде не сохраняется» — это сравнение текстов, транслитерация, расшифровка cron-выражений и разбор строки User-Agent. У остальных четырёх — своя, про конкретные данные: «Содержимое JSON никуда не отправляется и нигде не сохраняется», «Текст и файлы обрабатываются в браузере и никуда не отправляются», «Пароли генерируются в браузере: они никуда не отправляются и нигде не сохраняются», «Коды рисуются в браузере, загруженные картинки никуда не отправляются».
Четырём нужна сеть, и наружу уходит только то, что вы ввели:
- «Мой IP» — адрес поставщику геоданных, см. раздел выше;
- проверка DNS — имя домена DNS-серверу, выбранному в самом инструменте. По умолчанию там стоит публичный сервер Google
8.8.8.8, и адрес видно прямо в поле на странице; - WHOIS — строка запроса в IANA и дальше в регистратуру, на которую та укажет;
- проверка SSL — соединение с указанным узлом и портом.
Запрос делает сервер сайта, а не ваш браузер, поэтому наружу он уходит с адреса сервера. Ответы этих четырёх — в том числе отказы, чтобы не долбить регистратуры, — складываются в общий кеш в памяти процесса. Минуту ответ считается свежим; сама запись лежит там и дальше, пока её не перезапишет повторный запрос по тому же ключу, не вытеснят 300 более новых ключей или пока приложение не перезапустят. Для «Моего IP» это значит, что адрес вместе с обратным именем, городом и провайдером живёт в памяти дольше минуты — на тихом сайте до перезапуска.
Оговорка про строку поиска в шапке. Её команды вроде пароль 24 или cron 0 3 * * 1 считаются в браузере, но подсказки при этом уходят на сервер сайта — то есть набранное целиком попадает в обычный поисковый запрос к нему. Обещание «введённое не покидает браузер» дано страницам инструментов, а не командной строке.
Кому уходят данные
- Яндекс и Google — счётчики посещаемости, только с согласия;
- поставщик геоданных — проверяемый адрес в «Моём IP»;
- сервер имён, настроенный на сервере сайта, — проверяемый адрес в обратном запросе «Моего IP» и имя домена, если вы ввели домен;
- выбранный DNS-сервер — имя домена. По умолчанию выбран
8.8.8.8, то есть это снова Google, но уже без всякой связи со счётчиками и с согласием: запрос делаете вы сами, нажимая «Проверить»; - IANA и регистратуры — строка запроса WHOIS;
- проверяемый узел — соединение при проверке сертификата.
Больше данных читателя не уходит никуда. Шрифты и скрипты сайт раздаёт со своего домена: ни Google Fonts, ни сторонних CDN на страницах нет.