
Détecteur de fuites de confidentialité dans le navigateur — huit modules de détection, évaluation des risques et historique par compte, le tout dans votre navigateur.
Détecteur de fuites de vie privée dans le navigateur — huit modules de détection, score de risque et historique par compte, le tout dans votre navigateur.
Construit avec Verdent — un assistant de codage agentique. Chaque module de détection, le tableau de bord analytique, le flux d'authentification par clé API, l'interface bilingue et l'image Docker prête pour Kubernetes ont été conçus et implémentés lors de sessions de programmation en binôme pilotées par Verdent.
Ouvrez une URL, cliquez sur Run all, et en quelques secondes Leakish vous indique ce que
votre navigateur divulgue à votre sujet et sur votre réseau — via WebRTC, les API
d'empreinte numérique, DNS, et une sonde côté serveur. Huit modules indépendants produisent chacun un
résultat typé + des signaux de risque, un score agrégé (0–100) et un niveau
(safe / warning / critical).
Les utilisateurs connectés peuvent enregistrer les analyses dans MySQL, parcourir l'historique,
et ouvrir un tableau de bord analytique qui affiche des graphiques de distribution, la répétition
d'empreintes de hachage, la chronologie IP / ASN, les analyses aberrantes, et une comparaison
par paire. Tout le reste (le détecteur lui-même) fonctionne sans compte — n'importe qui peut
accéder à /app et lancer une analyse.
Chaque module est enregistré via une interface DetectionModule<T> typée unique
et s'exécute isolément — un module qui échoue n'affecte pas les autres. L'état
d'activation par module est conservé dans localStorage avec une clé de version,
survit à un rafraîchissement, et le bouton Run all ne parcourt que l'ensemble activé.
/api/detect/network pour lire sa propre IP observée par le serveur,
ou (c) le module DNS communique avec https://dns.google/resolve.leakish.locale, pilote <html lang>, les métadonnées de page, chaque écran,
chaque réponse d'erreur API, et l'email de connexion par lien magique.det_… sur la page
Intégrations (SHA-256 stocké, texte brut affiché une seule fois). Chaque
point de terminaison /api/detect/* accepte soit un cookie de session, soit une clé Bearer, donc
la même analyse peut être enregistrée depuis un CLI / job CI./scans/analytics — graphiques de distribution par
fuseau horaire / plateforme / langue / écran / WebGL / ASN / pays / nombre de polices,
répétition d'empreintes de hachage avec un grade de risque par type, chronologie IP / ASN,
détecteur d'aberrations multi-axes, comparaison par paire avec score de similarité 0–100.Prérequis : Node 22+ (tout ce qui est 20+ fonctionne pour le développement local), Yarn 1.x, une instance MySQL en cours d'exécution, et (optionnellement) un client OAuth Google.
yarn install
cp env.example .env.local # remplir DATABASE_URL, NEXTAUTH_SECRET, IP_HASH_SALT au minimum
yarn prisma:generate
yarn db:push # provisionner les tables sur une nouvelle base de données
yarn dev # http://localhost:3000
Variables d'environnement minimales pour une connexion fonctionnelle :
DATABASE_URL — ex. mysql://root:[email protected]:3306/detectNEXTAUTH_SECRET — openssl rand -base64 32NEXTAUTH_URL — http://localhost:3000 en développementIP_HASH_SALT — openssl rand -base64 32Optionnelles :
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET pour la connexion GoogleMAILGUN_API_KEY / MAILGUN_DOMAIN / EMAIL_FROM pour la livraison réelle de liens magiques
(sans cela, le lien est imprimé dans la console du serveur de développement)IPINFO_TOKEN pour enrichir la sonde réseau avec les données ASN / VPN / proxyVoir env.example pour la liste complète annotée.
app/
├── (marketing)/ # / — Page d'accueil (état d'auth résolu côté serveur + UI client)
├── app/ # /app — la page du détecteur
├── login/ # /login
├── scans/ # /scans, /scans/[id], /scans/analytics
├── integrations/ # /integrations — gestion des clés API
├── api/
│ ├── auth/ # Route NextAuth + login par clé API + tests
│ ├── detect/
│ │ ├── analytics/ # agrégation + comparaison par paire
│ │ ├── network/ # sonde de trafic sortant côté serveur
│ │ ├── scans/ # enregistrer / lister / obtenir / supprimer
│ │ └── uniqueness/ # combien d'utilisateurs partagent ce hachage d'empreinte
│ ├── integration/keys # créer / révoquer / lister les clés API
│ └── health/ # sonde de vivacité pour k8s
├── opengraph-image.tsx # OG dynamique (par locale)
├── apple-icon.tsx # icône apple-touch dynamique
├── icon.svg # dégradé de bouclier
└── layout.tsx # métadonnées + script d'initialisation du thème + LocaleProvider
components/
├── modular-detector.tsx # coque de plus haut niveau (en-tête + liste des modules + résultats/vue d'ensemble)
├── detector/ # liste des modules, panneau de résultats, filtre de catégorie, hook d'état
├── result-details/ # une vue de détail par module (interrupteur typé)
├── overview/ # panneau de vue d'ensemble + export de diagnostic
├── auth/ # AuthGateProvider, dialogue de connexion, formulaire de connexion
├── providers/ # wrapper SessionProvider
└── ui/ # primitives de style shadcn + bascules thème/locale
lib/
├── detection-modules/ # 8 implémentations de modules + ModuleManager + utilitaires IP + tests
├── risk/ # assess.ts — agrégation RiskSignal/score
├── i18n/ # en.ts / zh.ts + type Messages + locale client/serveur
├── api/ # wrapper withDetectAuth, schéma Zod de charge utile d'analyse
├── client/ # API d'analyse côté navigateur (extractFingerprintInputs, saveScan, lookupUniqueness)
├── server/ # sonde réseau, sel de hachage IP, hachage d'empreinte, limite de taux, envoi d'email, analytiques
├── persistence/ # wrappers localStorage sécurisés pour SSR
├── env.ts # validation d'environnement à l'exécution
├── logger.ts # journal de diagnostic pour le développement uniquement
└── prisma.ts # client singleton ciblant .prisma/detect-client
prisma/schema.prisma # User / Account / Session / DetectScan / ApiKey / DetectFingerprintHash
/app. Le détecteur parcourt les modules activés
via ModuleManager.runAllEnabledModules — l'échec de chaque module est
capturé et isolé afin que les autres résultats continuent de s'afficher.DetectionResult<T> typé (avec un tag success | failure
et des données data spécifiques au module). Le panneau de résultats affiche un composant de détail
par module via un switch sûr au niveau du typage.lib/risk/assess.ts parcourt chaque résultat, émet des RiskSignal avec des identifiants stables,
et produit une OverallAssessment (score + niveau + compteurs).POST
vers /api/detect/scans. Le serveur valide avec Zod, exécute sa propre sonde
réseau pour enregistrer l'IP / ASN / indicateurs VPN observés par le serveur, et écrit une
ligne plus des lignes .Les tests unitaires se trouvent à côté de leurs sujets dans des répertoires __tests__/ :
yarn test # suite complète
yarn test chemin/vers/fichier # fichier unique
yarn test -t "motif de nom" # par regex de nom de test
Points forts :
lib/detection-modules/__tests__/ — classification IP + extraction mDNS,
enregistrement du gestionnaire de modules et isolation des échecs, RTCPeerConnection simulé
pour le module WebRTC, tests de forme jsdom pour le module d'empreinte navigateur,
génération de signaux CDP/automatisation.lib/server/__tests__/analytics.test.ts — regroupement de distribution, groupement
de répétition, notation des aberrantes, calcul de similarité par paire.app/api/detect/scans/__tests__ — enregistrement POST (validation, limite de taux,
idempotence, élagage) + liste GET + suppression DELETE unique.app/api/integration/keys/__tests__ — création / révocation / liste avec
restriction de mode (les sessions de clé API ne peuvent pas générer d'autres clés API).app/api/auth/__tests__ — route de connexion par clé API (CSRF, vérification de format,
gestion des clés révoquées / expirées, mise à jour de dernière utilisation).Lint + vérification de types :
yarn lint
npx tsc --noEmit
Le Dockerfile inclus produit une image standalone Next.js sur
node:22-alpine. L'environnement de production est injecté via un Secret Kubernetes — des valeurs
placées sont cuites au moment de la construction afin que SKIP_ENV_VALIDATION ne soit pas nécessaire
à l'exécution. Un job prisma db push exécute le schéma avant le déploiement. Voir
.github/workflows/deploy-tke.yml pour le pipeline complet de construction d'image → migration → déploiement.
Cette version open-source n'a pas de péage. Les enregistrements sont uniquement régis par le
limiteur de taux par utilisateur intégré dans lib/server/rate-limit.ts (10 enregistrements/heure),
et la conservation de l'historique est illimitée.
Voir LICENSE.
| ID | Module | Ce qu'il inspecte |
|---|
network-probe | Sonde de trafic réseau | IP publique observée par le serveur, ASN, pays/région/ville, indicateurs VPN/proxy/Tor/hébergement, TLS/HTTP |
webrtc | WebRTC | IPv4 + IPv6 publique via STUN, fuites RFC1918, candidats .local obfusqués par mDNS |
browser-fingerprint | Empreinte navigateur | UA, écran, fuseau horaire, plugins, cœurs CPU, mémoire appareil, liste de langues, DNT, cookies |
canvas-fingerprint | Canvas / WebGL | Chaînes renderer/vendor 2D + WebGL, bizarreries de rendu de texte, formats d'image supportés |
audio-fingerprint | Audio | Fréquence d'échantillonnage AudioContext, canaux, latence, hachage de sortie d'oscillateur |
font-detection | Polices | 40+ sondes de polices nommées via détection de différence de largeur Canvas |
dns | DNS | Accessibilité DoH, signal DNSSEC, géolocalisation du résolveur, heuristiques de fuite DNS |
cdp-detection | Automatisation / headless | navigator.webdriver, chronométrage CDP, surface d'API propre à Chromium, sondes de ports — confiance 0–1 |
lib/risk/assess.tsRiskSignalwebrtc.public-ip-leakMessagesPOST /api/detect/scans accepte un
en-tête Idempotency-Key, limite chaque utilisateur à 200 analyses, et limite le taux
d'enregistrement à 10/heure.node:22-alpine,
sortie standalone Next.js, déploiement sur Kubernetes via le workflow dans
.github/workflows/.| Chemin | Objectif |
|---|
/ | Page d'accueil marketing (héro aurore, cartes fonctionnalités, FAQ, CTA) |
/app | Le détecteur — liste des modules + panneau de résultats + vue d'ensemble |
/login | Page de connexion autonome (Google / email / clé API) |
/scans | Historique des analyses enregistrées de l'utilisateur connecté |
/scans/[id] | Détail d'une analyse enregistrée |
/scans/analytics | Distribution / répétition / chronologie / aberrantes / comparaison |
/integrations | Gérer les clés API det_… (créer / révoquer / mode d'emploi) |
DetectScanDetectFingerprintHash/scans/[id], contribue aux agrégats
d'analytiques, et compte pour la recherche d'unicité.| Couche | Composants |
|---|
| Framework | Next.js 14 (App Router, force-dynamic partout), React 18 |
| Langage | TypeScript 5, mode strict |
| UI | Tailwind CSS 3, primitives shadcn/ui sur Radix, icônes Lucide, Framer Motion |
| Auth | NextAuth 4 (OAuth Google + email de lien magique) + adaptateur Prisma |
| Données | Prisma 6 → MySQL (sortie client personnalisée à .prisma/detect-client) |
| Validation | Zod |
| Tests | Jest 29 + ts-jest + jsdom |
| Build / déploi | Dockerfile multi-étapes, Next.js standalone, manifests Kubernetes |