
Обнаружитель утечек приватности в браузере — восемь модулей обнаружения, оценка риска и история по аккаунтам, всё в вашем браузере.
Детектор утечек приватности браузера — восемь модулей обнаружения, оценка рисков и история по аккаунтам — всё в вашем браузере.
Создано с помощью Verdent — агентного ассистента по программированию. Каждый модуль обнаружения, аналитическая панель, аутентификация по API-ключу, двуязычный интерфейс и готовый для Kubernetes Docker-образ были спроектированы и реализованы в сессиях парного программирования под управлением Verdent.
Откройте URL, нажмите Запустить всё, и через несколько секунд Leakish сообщит вам,
что ваш браузер раскрывает о вас и вашей сети — через WebRTC, API снятия отпечатков,
DNS и серверный зонд. Восемь независимых модулей каждый выдают типизированный
результат + сигналы риска, агрегированную оценку (0–100) и уровень
(safe / warning / critical).
Авторизованные пользователи могут сохранять сканы в MySQL, просматривать историю и
открывать панель аналитики, которая показывает диаграммы распределения, повторяемость
хэшей отпечатков, временную шкалу IP/ASN, выбросы и попарное сравнение. Всё остальное
(сам детектор) работает без аккаунта — любой может перейти на /app и запустить скан.
Каждый модуль регистрируется через единый типизированный интерфейс DetectionModule<T>
и выполняется изолированно — сбой одного модуля не влияет на другие. Состояние
включения каждого модуля сохраняется в localStorage с ключом версии, переживает
обновление страницы, а кнопка Запустить всё обрабатывает только включённые модули.
/api/detect/network, чтобы получить
собственный IP, наблюдаемый сервером, или (в) модуль DNS связывается с
https://dns.google/resolve.leakish.locale, управляет <html lang>, метаданными страниц, каждым
экраном, каждым ответом API с ошибкой и письмом для входа по магической ссылке.det_… на странице
Интеграции (SHA-256 хранится, открытый текст показывается один раз). Каждый
конечный пункт /api/detect/* принимает либо сессионную куку, либо Bearer-ключ,
поэтому один и тот же скан можно сохранить из CLI / CI-задачи./scans/analytics — диаграммы распределения по
часовому поясу / платформе / языку / экрану / WebGL / ASN / стране / количеству
шрифтов, повторяемость хэшей отпечатков с оценкой риска для каждого вида,
временная шкала IP/ASN, многомерный детектор выбросов, попарное сравнение с
оценкой сходства 0–100.lib/risk/assess.ts
генерирует типизированные с устойчивыми ID (например,
), сводки по модулям и единую агрегированную оценку.
Осведомлённость о локали через внедрение .Предварительные требования: Node 22+ (подходит любой 20+ для локальной разработки), Yarn 1.x, работающий экземпляр MySQL и (опционально) клиент Google OAuth.
yarn install
cp env.example .env.local # заполнить DATABASE_URL, NEXTAUTH_SECRET, IP_HASH_SALT как минимум
yarn prisma:generate
yarn db:push # создать таблицы в свежей БД
yarn dev # http://localhost:3000
Минимальное окружение для работающего входа:
DATABASE_URL — например, mysql://root:[email protected]:3306/detectNEXTAUTH_SECRET — openssl rand -base64 32NEXTAUTH_URL — http://localhost:3000 в разработкеIP_HASH_SALT — openssl rand -base64 32Опционально:
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET для входа через GoogleMAILGUN_API_KEY / MAILGUN_DOMAIN / EMAIL_FROM для реальной доставки магических ссылок
(без них ссылка печатается в консоль сервера разработки)IPINFO_TOKEN для обогащения сетевого зонда данными ASN/VPN/проксиПолный аннотированный список см. в env.example.
app/
├── (marketing)/ # / — лендинг (состояние аутентификации, разрешённое сервером + клиентский UI)
├── app/ # /app — страница детектора
├── login/ # /login
├── scans/ # /scans, /scans/[id], /scans/analytics
├── integrations/ # /integrations — управление API-ключами
├── api/
│ ├── auth/ # Маршрут NextAuth + вход по API-ключу + тесты
│ ├── detect/
│ │ ├── analytics/ # Агрегированные данные + попарные различия
│ │ ├── network/ # Серверный зонд исхода
│ │ ├── scans/ # Сохранение / список / получение / удаление
│ │ └── uniqueness/ # Сколько пользователей имеют такой же хэш отпечатка
│ ├── integration/keys # Создание / отзыв / список API-ключей
│ └── health/ # Зонд жизнеспособности для k8s
├── opengraph-image.tsx # Динамическое OG-изображение (по локали)
├── apple-icon.tsx # Динамическая иконка apple-touch
├── icon.svg # Градиентный щит
└── layout.tsx # Метаданные + скрипт инициализации темы + LocaleProvider
components/
├── modular-detector.tsx # Верхнеуровневая оболочка (заголовок + список модулей + результат/обзор)
├── detector/ # Список модулей, панель результатов, фильтр категорий, хук состояния
├── result-details/ # Детальный просмотр для каждого модуля (типизированный switch)
├── overview/ # Панель обзора + экспорт диагностики
├── auth/ # AuthGateProvider, диалог входа, форма входа
├── providers/ # Обёртка SessionProvider
└── ui/ # Примитивы в стиле shadcn + переключатели темы/локали
lib/
├── detection-modules/ # 8 реализаций модулей + ModuleManager + IP-утилиты + тесты
├── risk/ # assess.ts — агрегация RiskSignal/оценки
├── i18n/ # en.ts / zh.ts + тип Messages + клиент/сервер локали
├── api/ # Обёртка withDetectAuth, схема Zod для payload скана
├── client/ # Клиентская API для сканов (extractFingerprintInputs, saveScan, lookupUniqueness)
├── server/ # Сетевой зонд, соль IP-хэша, хэширование отпечатков, ограничение скорости, отправка письма, аналитика
├── persistence/ # SSR-безопасные обёртки localStorage
├── env.ts # Проверка окружения во время выполнения
├── logger.ts # Диагностический логгер (только для разработки)
└── prisma.ts # Синглтон клиента, нацеленного на .prisma/detect-client
prisma/schema.prisma # Пользователь / Аккаунт / Сессия / DetectScan / ApiKey / DetectFingerprintHash
/app. Детектор перебирает включённые
модули через ModuleManager.runAllEnabledModules — сбой каждого модуля
перехватывается и изолируется, чтобы остальные результаты всё равно отображались.DetectionResult<T> (с тегом
success | failure и специфичными для модуля данными). Панель результатов
отображает детальный компонент для каждого модуля через типобезопасный switch.lib/risk/assess.ts проходит по каждому результату, генерирует RiskSignal с
устойчивыми ID и формирует OverallAssessment (оценка + уровень + количество).POST
на /api/detect/scans. Сервер проверяет с помощью Zod, запускает собственный
сетевой зонд для записи наблюдаемого сервером IP/ASN/флагов VPN и записывает
строку DetectScan плюс строки .Модульные тесты находятся рядом с тестируемым кодом в каталогах __tests__/:
yarn test # полный набор
yarn test path/to/file # один файл
yarn test -t "name pattern" # по регулярному выражению имени теста
Основные моменты:
lib/detection-modules/__tests__/ — классификация IP + извлечение mDNS,
регистрация модулей и изоляция сбоев, моки RTCPeerConnection для модуля
WebRTC, тесты формы jsdom для модуля browser-fingerprint, генерация сигналов
CDP/автоматизации.lib/server/__tests__/analytics.test.ts — группировка распределений,
группировка повторений, оценка выбросов, математика попарного сходства.app/api/detect/scans/__tests__ — POST сохранение (валидация, ограничение
скорости, идемпотентность, очистка) + GET список + DELETE один.app/api/integration/keys/__tests__ — создание / отзыв / список с
ограничением режима (сессии API-ключей не могут создавать другие API-ключи).app/api/auth/__tests__ — маршрут входа по API-ключу (CSRF, проверка формата,
обработка отозванных/просроченных, обновление времени последнего использования).Линтер + проверка типов:
yarn lint
npx tsc --noEmit
Включённый Dockerfile создаёт автономный образ Next.js на node:22-alpine.
Производственное окружение внедряется через секрет Kubernetes — значения-заглушки
запекаются на этапе сборки, так что SKIP_ENV_VALIDATION не требуется во время
выполнения. Job prisma db push выполняет схему перед развёртыванием. Полный
конвейер сборки образа → миграции → развёртывания см. в
.github/workflows/deploy-tke.yml.
Эта сборка с открытым исходным кодом не имеет платного доступа. Сохранения
регулируются только внутрипроцессным ограничителем скорости на пользователя
в lib/server/rate-limit.ts (10 сохранений/час), а хранение истории неограничено.
См. LICENSE.
| ID | Модуль | Что проверяет |
|---|
network-probe | Зонд сетевого исхода | Общедоступный IP, ASN, страна/регион/город, флаги VPN/прокси/Tor/хостинг, TLS/HTTP |
webrtc | WebRTC | Публичные IPv4 + IPv6 через STUN, утечки RFC1918, mDNS-обфусцированные кандидаты .local |
browser-fingerprint | Отпечаток браузера | UA, экран, часовой пояс, плагины, ядра CPU, память устройства, список языков, DNT, куки |
canvas-fingerprint | Canvas / WebGL | Строки рендерера/вендора 2D + WebGL, особенности отрисовки текста, поддерживаемые форматы изображений |
audio-fingerprint | Аудио | AudioContext частота дискретизации, каналы, задержка, хэш выхода осциллятора |
font-detection | Шрифты | 40+ проб именованных шрифтов через определение разницы ширины Canvas |
dns | DNS | Доступность DoH, сигнал DNSSEC, геолокация резолвера, эвристики утечки DNS |
cdp-detection | Автоматизация/безголовость | navigator.webdriver, тайминги CDP, только для Chromium API, портовые пробы — достоверность 0–1 |
RiskSignalwebrtc.public-ip-leakMessagesPOST /api/detect/scans
принимает заголовок Idempotency-Key, ограничивает каждого пользователя 200
сканов и ограничивает скорость сохранения до 10/час.node:22-alpine,
автономный вывод Next.js, развёртывается на Kubernetes через workflow в
.github/workflows/.| Путь | Назначение |
|---|
/ | Маркетинговая лендинг (hero с полярным сиянием, карточки возможностей, FAQ, CTA) |
/app | Детектор — список модулей + панель результатов + обзор |
/login | Отдельная страница входа (Google / email / API-ключ) |
/scans | История сохранённых сканов авторизованного пользователя |
/scans/[id] | Детали одного сохранённого скана |
/scans/analytics | Распределение / повторяемость / временная шкала / выбросы / сравнение |
/integrations | Управление API-ключами det_… (создание / отзыв / инструкция) |
DetectFingerprintHash/scans/[id], участвует в агрегатах аналитики и
учитывается при поиске уникальности.| Слой | Компоненты |
|---|
| Фреймворк | Next.js 14 (App Router, force-dynamic везде), React 18 |
| Язык | TypeScript 5, строгий режим |
| UI | Tailwind CSS 3, примитивы shadcn/ui на Radix, иконки Lucide, Framer Motion |
| Аутентификация | NextAuth 4 (Google OAuth + магические ссылки email) + адаптер Prisma |
| Данные | Prisma 6 → MySQL (пользовательский вывод клиента в .prisma/detect-client) |
| Валидация | Zod |
| Тесты | Jest 29 + ts-jest + jsdom |
| Сборка/развёртка | Многоступенчатый Dockerfile, автономный вывод Next.js, манифесты Kubernetes |