
Detector de vazamento de privacidade do navegador — oito módulos de detecção, pontuação de risco e histórico por conta, tudo no seu navegador.
Detetor de vazamentos de privacidade do navegador — oito módulos de deteção, pontuação de risco e histórico por conta, tudo no seu navegador.
Construído com Verdent — um assistente de codificação agente. Cada módulo de deteção, o painel de análise, o fluxo de autenticação via chave de API, a interface bilíngue e a imagem Docker pronta para Kubernetes foram projetados e implementados em sessões de programação em par guiadas pelo Verdent.
Abra uma URL, clique em Executar tudo e, em poucos segundos, o Leakish informa o que
o seu navegador está a vazar sobre si e sobre a sua rede — via WebRTC, APIs de
impressão digital, DNS e uma sonda no servidor. Oito módulos independentes produzem cada um
um resultado tipado + sinais de risco, uma pontuação agregada (0–100) e um nível
(seguro / aviso / crítico).
Utilizadores com sessão iniciada podem guardar as análises no MySQL, navegar pelo histórico e abrir um painel
de análise que mostra gráficos de distribuição, repetição de hash de impressão digital, linha do tempo de IP / ASN,
análises fora do comum e uma comparação par a par. O resto (o detetor
propriamente dito) funciona sem conta — qualquer pessoa pode aceder a /app e executar uma análise.
Cada módulo é registado através de uma única interface tipada DetectionModule<T>
e executa isoladamente — um módulo que falhe não afeta os outros. O estado ativado
por módulo é persistido no localStorage com uma chave de versão, sobrevive a
atualizações da página e o botão Executar tudo percorre apenas o conjunto ativado.
/api/detect/network para ler o seu próprio IP
observado pelo servidor, ou (c) o módulo DNS comunica com https://dns.google/resolve.leakish.locale, controla <html lang>, meta-dados da página, todos os ecrãs,
todas as respostas de erro da API e o e-mail de início de sessão por link mágico.det_… na página
Integrações (SHA-256 armazenado, texto simples mostrado uma vez). Todos os
endpoints /api/detect/* aceitam quer um cookie de sessão quer uma chave Bearer, de modo
que a mesma análise pode ser guardada a partir de um CLI / trabalho CI./scans/analytics — gráficos de distribuição por
fuso horário / plataforma / idioma / ecrã / WebGL / ASN / país / contagem de fontes,
repetição de hash de impressão digital com grau de risco por tipo, linha do tempo de IP / ASN,
detetor de valores atípicos multieixo, comparação par a par com pontuação de similaridade 0–100.Pré-requisitos: Node 22+ (qualquer versão 20+ funciona para desenvolvimento local), Yarn 1.x, uma instância MySQL em execução e (opcionalmente) um cliente Google OAuth.
yarn install
cp env.example .env.local # preencha pelo menos DATABASE_URL, NEXTAUTH_SECRET, IP_HASH_SALT
yarn prisma:generate
yarn db:push # provisiona as tabelas numa base de dados nova
yarn dev # http://localhost:3000
Ambiente mínimo para obter um início de sessão funcional:
DATABASE_URL — ex.: mysql://root:[email protected]:3306/detectNEXTAUTH_SECRET — openssl rand -base64 32NEXTAUTH_URL — http://localhost:3000 em desenvolvimentoIP_HASH_SALT — openssl rand -base64 32Opcional:
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET para início de sessão com GoogleMAILGUN_API_KEY / MAILGUN_DOMAIN / EMAIL_FROM para entrega real de links mágicos
(sem estes, o link é impresso na consola do servidor de desenvolvimento)IPINFO_TOKEN para enriquecer a sonda de rede com dados de ASN / VPN / proxyConsulte env.example para a lista completa anotada.
app/
├── (marketing)/ # / — Página inicial (estado de autenticação resolvido no servidor + UI do cliente)
├── app/ # /app — a página do detetor
├── login/ # /login
├── scans/ # /scans, /scans/[id], /scans/analytics
├── integrations/ # /integrations — gestão de chaves de API
├── api/
│ ├── auth/ # Rota NextAuth + login com chave de API + testes
│ ├── detect/
│ │ ├── analytics/ # agregados + diferenças par a par
│ │ ├── network/ # sonda de saída do servidor
│ │ ├── scans/ # guardar / listar / obter / eliminar
│ │ └── uniqueness/ # quantos utilizadores partilham este hash de impressão digital
│ ├── integration/keys # criar / revogar / listar chaves de API
│ └── health/ # sonda de atividade para k8s
├── opengraph-image.tsx # OG dinâmico (por localidade)
├── apple-icon.tsx # ícone apple-touch dinâmico
├── icon.svg # gradiente de escudo
└── layout.tsx # metadados + script de inicialização do tema + LocaleProvider
components/
├── modular-detector.tsx # shell de alto nível (cabeçalho + lista de módulos + resultados/visão geral)
├── detector/ # lista de módulos, painel de resultados, filtro por categoria, hook de estado
├── result-details/ # uma vista de detalhes por módulo (switch tipado)
├── overview/ # painel de visão geral + exportação de diagnósticos
├── auth/ # AuthGateProvider, diálogo de inicio de sessão, formulário de inicio de sessão
├── providers/ # wrapper do SessionProvider
└── ui/ # primitivas estilo shadcn + alternadores de tema/localidade
lib/
├── detection-modules/ # 8 implementações de módulos + ModuleManager + utilitários IP + testes
├── risk/ # assess.ts — RiscoSignal/agregação de pontuações
├── i18n/ # en.ts / zh.ts + tipo Messages + localidade cliente/servidor
├── api/ # wrapper withDetectAuth, esquema Zod do payload de análise
├── client/ # API de análise do lado do navegador (extractFingerprintInputs, saveScan, lookupUniqueness)
├── server/ # sonda de rede, salt de hash IP, hashing de impressão digital, limite de taxa, envio de e-mail, análise
├── persistence/ # wrappers do localStorage seguros para SSR
├── env.ts # validação de ambiente em tempo de execução
├── logger.ts # logger de diagnóstico apenas em desenvolvimento
└── prisma.ts # cliente singleton apontado para .prisma/detect-client
prisma/schema.prisma # User / Account / Session / DetectScan / ApiKey / DetectFingerprintHash
/app. O detetor itera os módulos ativados
através de ModuleManager.runAllEnabledModules — a falha de cada módulo é
capturada e isolada para que outros resultados ainda apareçam.DetectionResult<T> tipado (com etiqueta success | failure
e data específica do módulo). O painel de resultados renderiza um componente de detalhe
por módulo através de um switch seguro quanto ao tipo.lib/risk/assess.ts percorre cada resultado, emite RiskSignals com IDs estáveis,
e produz uma OverallAssessment (pontuação + nível + contagens).POST
a /api/detect/scans. O servidor valida com Zod, executa a sua própria sonda de rede
para registar o IP / ASN / flags de VPN observados pelo servidor e escreve uma
linha mais linhas .Os testes unitários residem junto dos seus sujeitos em diretorias __tests__/:
yarn test # suíte completa
yarn test caminho/para/ficheiro # ficheiro único
yarn test -t "padrão de nome" # por regex de nome de teste
Destaques:
lib/detection-modules/__tests__/ — classificação de IP + extração mDNS,
registo do gestor de módulos & isolamento de falhas, RTCPeerConnection simulada
para o módulo WebRTC, testes de forma jsdom para o módulo de impressão digital do
navegador, geração de sinais de automação/CDP.lib/server/__tests__/analytics.test.ts — agrupamento de distribuição, agrupamento
de repetição, pontuação de valores atípicos, matemática de similaridade par a par.app/api/detect/scans/__tests__ — guarda POST (validação, limite de taxa,
idempotência, poda) + lista GET + eliminação única DELETE.app/api/integration/keys/__tests__ — criar / revogar / listar com bloqueio de
modo (sessões com chave de API não podem gerar outras chaves de API).app/api/auth/__tests__ — rota de login com chave de API (CSRF, verificação de
formato, tratamento de revogadas/expiradas, atualização de último uso).Lint + verificação de tipos:
yarn lint
npx tsc --noEmit
O Dockerfile incluído produz uma imagem autónoma Next.js sobre
node:22-alpine. O ambiente de produção é injetado via Segredo Kubernetes — valores
placeholders são cozidos no momento da construção, pelo que SKIP_ENV_VALIDATION não é
necessário em tempo de execução. Um Job prisma db push executa o esquema antes da
distribuição. Consulte .github/workflows/deploy-tke.yml para o pipeline completo de
construção de imagem → migração → distribuição.
Esta versão de código aberto não tem paywall. As guardas são regidas exclusivamente pelo
limitador de taxa por utilizador em processo em lib/server/rate-limit.ts (10 guardas/hora),
e a retenção de histórico é ilimitada.
Consulte LICENSE.
| ID | Módulo | O que inspeciona |
|---|
network-probe | Sonda de saída de rede | IP público observado pelo servidor, ASN, país/região/cidade, flags de VPN/proxy/Tor/hosting, TLS/HTTP |
webrtc | WebRTC | IPv4 + IPv6 públicos via STUN, vazamentos RFC1918, candidatos .local ocultos por mDNS |
browser-fingerprint | Impressão digital do navegador | UA, ecrã, fuso horário, plugins, núcleos de CPU, memória do dispositivo, lista de idiomas, DNT, cookies |
canvas-fingerprint | Canvas / WebGL | Strings de renderização/vendedor 2D + WebGL, peculiaridades de renderização de texto, formatos de imagem suportados |
audio-fingerprint | Áudio | Taxa de amostragem do AudioContext, canais, latência, hash da saída do oscilador |
font-detection | Fontes | Mais de 40 sondas de fontes nomeadas via deteção por diferença de largura no Canvas |
dns | DNS | Acessibilidade DoH, sinal DNSSEC, geolocalização do resolvedor, heurísticas de vazamento DNS |
cdp-detection | Automação / headless | navigator.webdriver, temporização CDP, superfície de API exclusiva do Chromium, sondas de porta — confiança 0–1 |
lib/risk/assess.tsRiskSignalwebrtc.public-ip-leakMessagesPOST /api/detect/scans aceita um
cabeçalho Idempotency-Key, limita cada utilizador a 200 análises e limita a taxa de guardas
a 10/hora.node:22-alpine,
saída autónoma do Next.js, implementa no Kubernetes via o fluxo de trabalho em
.github/workflows/.| Caminho | Propósito |
|---|
/ | Página de marketing (hero aurora, cartões de funcionalidades, FAQ, CTA) |
/app | O detetor — lista de módulos + painel de resultados + visão geral |
/login | Página de início de sessão autónoma (Google / e-mail / chave de API) |
/scans | Histórico de análises guardadas do utilizador com sessão |
/scans/[id] | Detalhe de uma análise guardada |
/scans/analytics | Distribuição / repetição / linha do tempo / valores atípicos / comparação |
/integrations | Gerir chaves de API det_… (criar / revogar / como usar) |
DetectScanDetectFingerprintHash/scans/[id], contribui para os agregados
de análise e conta para a consulta de singularidade.| Camada | Componentes |
|---|
| Framework | Next.js 14 (App Router, force-dynamic em todo o lado), React 18 |
| Linguagem | TypeScript 5, modo estrito |
| Interface | Tailwind CSS 3, primitivas shadcn/ui sobre Radix, ícones Lucide, Framer Motion |
| Autenticação | NextAuth 4 (Google OAuth + e-mail de link mágico) + adaptador Prisma |
| Dados | Prisma 6 → MySQL (saída de cliente personalizada em .prisma/detect-client) |
| Validação | Zod |
| Testes | Jest 29 + ts-jest + jsdom |
| Build / deploy | Dockerfile multi-estágio, Next.js standalone, manifestos Kubernetes |