
Rilevatore di fughe di privacy nel browser — otto moduli di rilevamento, punteggio di rischio e cronologia per account, tutto nel tuo browser.
Rilevatore di fughe di privacy del browser — otto moduli di rilevamento, punteggio di rischio e cronologia per account, tutto nel tuo browser.
Costruito con Verdent — un assistente di codifica agentico. Ogni modulo di rilevamento, la dashboard di analisi, il flusso di autenticazione con chiave API, l'interfaccia bilingue e l'immagine Docker pronta per Kubernetes sono stati progettati e implementati in sessioni di pair programming guidate da Verdent.
Apri un URL, clicca Esegui tutto, e in pochi secondi Leakish ti dice cosa il tuo browser sta rivelando su di te e la tua rete — tramite WebRTC, API di fingerprinting, DNS e un probe lato server. Otto moduli indipendenti producono ciascuno un risultato tipizzato + segnali di rischio, un punteggio aggregato (0–100) e un livello (safe / warning / critical). Gli utenti autenticati possono salvare le scansioni in MySQL, sfogliare la cronologia e aprire una dashboard analitica che mostra grafici di distribuzione, ripetizione di hash di fingerprint, timeline IP / ASN, scansioni anomale e un confronto a coppie. Tutto il resto (il rilevatore stesso) funziona senza account — chiunque può atterrare su /app ed eseguire una scansione.
Ogni modulo è registrato attraverso una singola interfaccia tipizzata DetectionModule<T> e viene eseguito in isolamento — un modulo che genera un'eccezione non influenza gli altri. Lo stato di abilitazione per modulo è persistito in localStorage con una chiave di versione, sopravvive all'aggiornamento e il pulsante Esegui tutto processa solo l'insieme abilitato.
/api/detect/network per leggere il proprio IP osservato dal server, o (c) il modulo DNS parla con https://dns.google/resolve.leakish.locale, guida <html lang>, metadati della pagina, ogni schermata, ogni risposta di errore API e l'email di accesso con magic link.det_… nella pagina Integrations (SHA-256 memorizzato, testo in chiaro mostrato una volta). Ogni endpoint /api/detect/* accetta sia un cookie di sessione che una chiave Bearer, quindi la stessa scansione può essere salvata da un lavoro CLI / CI./scans/analytics — grafici di distribuzione per fuso orario / piattaforma / lingua / schermo / WebGL / ASN / paese / conteggio caratteri, ripetizione di hash di fingerprint con un grado di rischio per tipo, timeline IP / ASN, rilevatore di anomalie multi-asse, confronto a coppie con punteggio di somiglianza 0–100.Prerequisiti: Node 22+ (qualsiasi 20+ funziona per lo sviluppo locale), Yarn 1.x, un'istanza MySQL in esecuzione e (opzionalmente) un client Google OAuth.
yarn install
cp env.example .env.local # compila DATABASE_URL, NEXTAUTH_SECRET, IP_HASH_SALT come minimo
yarn prisma:generate
yarn db:push # fornisce le tabelle su un DB nuovo
yarn dev # http://localhost:3000
Env minimo per ottenere un accesso funzionante:
DATABASE_URL — es. mysql://root:[email protected]:3306/detectNEXTAUTH_SECRET — openssl rand -base64 32NEXTAUTH_URL — http://localhost:3000 in sviluppoIP_HASH_SALT — openssl rand -base64 32Opzionale:
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET per l'accesso con GoogleMAILGUN_API_KEY / MAILGUN_DOMAIN / EMAIL_FROM per la consegna reale del magic link (senza questi, il link viene stampato nella console del server di sviluppo)IPINFO_TOKEN per arricchire il probe di rete con dati ASN / VPN / proxyVedi env.example per l'elenco completo annotato.
app/
├── (marketing)/ # / — Pagina di atterraggio (stato di autenticazione risolto lato server + UI client)
├── app/ # /app — la pagina del rilevatore
├── login/ # /login
├── scans/ # /scans, /scans/[id], /scans/analytics
├── integrations/ # /integrations — gestione chiavi API
├── api/
│ ├── auth/ # Route NextAuth + login con chiave API + test
│ ├── detect/
│ │ ├── analytics/ # dati aggregati + diff a coppie
│ │ ├── network/ # probe di uscita lato server
│ │ ├── scans/ # salva / elenca / ottieni / elimina
│ │ └── uniqueness/ # quanti utenti condividono questo hash di fingerprint
│ ├── integration/keys # crea / revoca / elenca chiavi API
│ └── health/ # probe di liveness per k8s
├── opengraph-image.tsx # OG dinamico (per lingua)
├── apple-icon.tsx # icona apple-touch dinamica
├── icon.svg # gradiente a scudo
└── layout.tsx # metadati + script di inizializzazione tema + LocaleProvider
components/
├── modular-detector.tsx # shell di alto livello (header + elenco moduli + risultati/panoramica)
├── detector/ # elenco moduli, pannello risultati, filtro per categoria, hook di stato
├── result-details/ # una vista dettagliata per modulo (switch tipizzato)
├── overview/ # pannello panoramica + esportazione diagnostica
├── auth/ # AuthGateProvider, finestra di dialogo login, modulo login
├── providers/ # wrapper SessionProvider
└── ui/ # primitive in stile shadcn + interruttori tema/lingua
lib/
├── detection-modules/ # 8 implementazioni moduli + ModuleManager + utility IP + test
├── risk/ # assess.ts — aggregazione RiskSignal/punteggio
├── i18n/ # en.ts / zh.ts + tipo Messages + client/server per lingua
├── api/ # wrapper withDetectAuth, schema Zod per payload scansione
├── client/ # API scansione lato browser (extractFingerprintInputs, saveScan, lookupUniqueness)
├── server/ # probe di rete, salt IP-hash, hashing fingerprint, limitazione frequenza, invio email, analisi
├── persistence/ # wrapper localStorage sicuri per SSR
├── env.ts # validazione runtime delle variabili d'ambiente
├── logger.ts # logger diagnostico solo sviluppo
└── prisma.ts # client singleton puntato a .prisma/detect-client
prisma/schema.prisma # User / Account / Session / DetectScan / ApiKey / DetectFingerprintHash
/app. Il rilevatore itera i moduli abilitati tramite ModuleManager.runAllEnabledModules — l'errore di ogni modulo viene catturato e isolato, così gli altri risultati vengono comunque mostrati.DetectionResult<T> tipizzato (con tag success | failure e dati specifici del modulo). Il pannello dei risultati renderizza un componente dettaglio per modulo tramite un switch type-safe.lib/risk/assess.ts esamina ogni risultato, emette RiskSignal con ID stabili e produce un OverallAssessment (punteggio + livello + conteggi).POST a /api/detect/scans. Il server convalida con Zod, esegue il proprio probe di rete per registrare IP/ASN/flag VPN osservati dal server e scrive una riga DetectScan più righe .I test unitari risiedono accanto al loro soggetto nelle directory __tests__/:
yarn test # suite completa
yarn test path/to/file # singolo file
yarn test -t "pattern" # per regex del nome del test
Punti salienti:
lib/detection-modules/__tests__/ — classificazione IP + estrazione mDNS, registrazione e isolamento degli errori dei moduli, RTCPeerConnection mockata per il modulo WebRTC, test di forma jsdom per il modulo browser-fingerprint, generazione di segnali CDP/automazione.lib/server/__tests__/analytics.test.ts — raggruppamento in bucket delle distribuzioni, raggruppamento delle ripetizioni, punteggio di anomalia, calcolo della similarità a coppie.app/api/detect/scans/__tests__ — salvataggio POST (validazione, limitazione frequenza, idempotenza, potatura) + elenco GET + cancellazione singola.app/api/integration/keys/__tests__ — creazione / revoca / elenco con controllo della modalità (sessioni con chiave API non possono creare altre chiavi API).app/api/auth/__tests__ — route di login con chiave API (CSRF, controllo formato, gestione chiavi revocate/scadute, aggiornamento last-used).Lint + typecheck:
yarn lint
npx tsc --noEmit
Il Dockerfile incluso produce un'immagine standalone Next.js su node:22-alpine. Le variabili d'ambiente di produzione vengono iniettate tramite Kubernetes Secret — valori placeholder sono inseriti in fase di build così SKIP_ENV_VALIDATION non è richiesto in esecuzione. Un Job prisma db push esegue lo schema prima del rollout. Vedi .github/workflows/deploy-tke.yml per l'intero pipeline di build immagine → migrazione → rollout.
Questa build open-source non ha paywall. I salvataggi sono regolati esclusivamente dal limitatore di frequenza per utente in-process in lib/server/rate-limit.ts (10 salvataggi/ora) e la conservazione della cronologia è illimitata.
Vedi LICENSE.
| ID | Modulo | Cosa ispeziona |
|---|
network-probe | Probe di uscita di rete | Indirizzo IP pubblico osservato dal server, ASN, paese/regione/città, flag VPN/proxy/Tor/hosting, TLS/HTTP |
webrtc | WebRTC | IPv4 + IPv6 pubblici tramite STUN, perdite RFC1918, candidati .local offuscati da mDNS |
browser-fingerprint | Fingerprint del browser | UA, schermo, fuso orario, plugin, core CPU, memoria dispositivo, elenco lingue, DNT, cookie |
canvas-fingerprint | Canvas / WebGL | Stringhe renderer/vendor 2D + WebGL, stranezze di rendering del testo, formati immagine supportati |
audio-fingerprint | Audio | Frequenza di campionamento AudioContext, canali, latenza, hash dell'output dell'oscillatore |
font-detection | Caratteri | Oltre 40 probe di font nominati tramite rilevamento della differenza di larghezza Canvas |
dns | DNS | Raggiungibilità DoH, segnale DNSSEC, geolocalizzazione del resolver, euristiche di perdita DNS |
cdp-detection | Automazione / headless | navigator.webdriver, timing CDP, superficie API solo Chromium, probe di porta — confidenza 0–1 |
lib/risk/assess.tsRiskSignalwebrtc.public-ip-leakMessagesPOST /api/detect/scans accetta un header Idempotency-Key, limita ogni utente a 200 scansioni e limita la frequenza di salvataggio a 10/ora.node:22-alpine, output standalone Next.js, distribuito su Kubernetes tramite il workflow in .github/workflows/.| Percorso | Scopo |
|---|
/ | Pagina di atterraggio marketing (hero aurora, schede funzionalità, FAQ, CTA) |
/app | Il rilevatore — elenco moduli + pannello risultati + panoramica |
/login | Pagina di accesso standalone (Google / email / chiave API) |
/scans | Cronologia delle scansioni salvate dell'utente autenticato |
/scans/[id] | Dettaglio di una singola scansione salvata |
/scans/analytics | Distribuzione / ripetizione / timeline / anomalie / confronto |
/integrations | Gestisci chiavi API det_… (crea / revoca / come fare) |
DetectFingerprintHash/scans/[id], contribuisce agli aggregati analitici e conta nella ricerca di unicità.| Livello | Componenti |
|---|
| Framework | Next.js 14 (App Router, force-dynamic ovunque), React 18 |
| Linguaggio | TypeScript 5, modalità strict |
| UI | Tailwind CSS 3, primitive shadcn/ui su Radix, icone Lucide, Framer Motion |
| Auth | NextAuth 4 (Google OAuth + email magic link) + adattatore Prisma |
| Dati | Prisma 6 → MySQL (output client personalizzato in .prisma/detect-client) |
| Validazione | Zod |
| Test | Jest 29 + ts-jest + jsdom |
| Build/deploy | Dockerfile multi-stage, Next.js standalone, manifest Kubernetes |