浏览器隐私泄露检测器 — 包含八个检测模块、风险评分和每账户历史记录,全部集成于浏览器中。
基于 Verdent 构建 — 一个智能编码助手。 每一个检测模块、分析仪表板、API密钥认证流程、双语界面以及支持Kubernetes的Docker镜像,均通过Verdent驱动的结对编程会话设计并实现。
打开一个 URL,点击 运行全部,几秒钟内 Leakish 就会告诉你浏览器通过 WebRTC、指纹 API、DNS 以及服务器端探测泄露了哪些关于你和网络的信息。八个独立模块各自输出类型化结果及风险信号,一个聚合评分(0–100)和级别(安全 / 警告 / 严重)。
登录用户可以将扫描结果保存到 MySQL,浏览历史记录,并打开一个分析仪表板,显示分布图表、指纹哈希重复情况、IP/ASN 时间线、异常扫描以及成对比较。其他所有功能(检测器本身)无需账户即可使用 —— 任何人都可以直接访问 /app 运行扫描。
每个模块都通过一个统一的类型化 DetectionModule<T> 接口注册,并隔离运行——一个模块抛出异常不会影响其他模块。每个模块的启用状态存储在 localStorage 中,带有版本键,刷新后保持不变,运行全部按钮仅遍历已启用的集合。
/api/detect/network 读取其自身由服务器观察到的 IP;(c) DNS 模块与 https://dns.google/resolve 通信。leakish.locale cookie 中保存,驱动 <html lang>、页面元数据、每个界面、每个 API 错误响应以及魔法链接登录邮件。det_… API 密钥(SHA-256 存储,明文仅显示一次)。每个 /api/detect/* 端点都接受会话 cookie 或 Bearer 密钥,因此可以从 CLI/CI 作业保存相同的扫描结果。/scans/analytics — 展示时区/平台/语言/屏幕/WebGL/ASN/国家/字体数量的分布图表、按类型分组的指纹哈希重复及风险评级、IP/ASN 时间线、多轴异常检测器、以及相似度评分 0-100 的成对比较。lib/risk/assess.ts 生成具有稳定 ID 的类型化 RiskSignal(例如 webrtc.public-ip-leak)、每个模块的摘要以及一个聚合分数。通过 Messages 注入支持区域感知。前提条件: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:3000IP_HASH_SALT — openssl rand -base64 32可选的环境变量:
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET 用于 Google 登录MAILGUN_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 路由 + apiKey 登录 + 测试
│ ├── detect/
│ │ ├── analytics/ # 聚合 + 成对差异
│ │ ├── network/ # 服务端出口探测
│ │ ├── scans/ # 保存 / 列表 / 获取 / 删除
│ │ └── uniqueness/ # 有多少用户共享此指纹哈希
│ ├── integration/keys # 创建 / 撤销 / 列表 API 密钥
│ └── health/ # Kubernetes 存活探针
├── opengraph-image.tsx # 动态 OG(按区域设置)
├── apple-icon.tsx # 动态苹果触控图标
├── 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 模式
├── client/ # 浏览器端扫描 API(extractFingerprintInputs、saveScan、lookupUniqueness)
├── server/ # 网络探测、IP 哈希盐、指纹哈希、速率限制、发送邮件、分析
├── persistence/ # SSR 安全的 localStorage 包装器
├── env.ts # 运行时环境变量验证
├── logger.ts # 开发环境诊断日志
└── prisma.ts # 指向 .prisma/detect-client 的单例客户端
prisma/schema.prisma # User / Account / Session / DetectScan / ApiKey / DetectFingerprintHash
/app 中点击 运行全部。检测器通过 ModuleManager.runAllEnabledModules 遍历已启用的模块——每个模块的失败都会被捕获并隔离,因此其他结果仍然可以显示。DetectionResult<T>(带有 success | failure 标签以及模块特定的 data)。结果面板通过类型安全的 switch 渲染每个模块的详情组件。lib/risk/assess.ts 遍历每个结果,发出带有稳定 ID 的 RiskSignal,并生成 OverallAssessment(分数 + 等级 + 计数)。POST 到 /api/detect/scans。服务器使用 Zod 验证,运行自己的网络探测以记录服务器观察到的 IP / ASN / VPN 标志,并写入一行 DetectScan 以及若干 DetectFingerprintHash 行。单元测试与其测试对象位于同一目录下的 __tests__/ 文件夹中:
yarn test # 运行全部测试
yarn test path/to/file # 运行单个文件
yarn test -t "name pattern" # 根据测试名称正则匹配运行
亮点:
lib/detection-modules/__tests__/ — IP 分类 + mDNS 提取、模块管理器注册与故障隔离、模拟的 RTCPeerConnection 用于 WebRTC 模块、jsdom 形状测试用于浏览器指纹模块、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__ — apiKey 登录路由(CSRF、格式检查、已撤销/已过期的处理、最后使用时间更新)。Lint + 类型检查:
yarn lint
npx tsc --noEmit
附带的 Dockerfile 在 node:22-alpine 上生成一个 Next.js standalone 镜像。生产环境变量通过 Kubernetes Secret 注入——构建时嵌入占位值,因此运行时无需 SKIP_ENV_VALIDATION。一个 prisma db push Job 在部署前运行 schema。完整流程(镜像构建 → 迁移 → 部署)请参见 .github/workflows/deploy-tke.yml。
此开源版本没有付费墙。保存操作仅受 lib/server/rate-limit.ts 中进程内每用户速率限制器约束(10 次保存/小时),历史记录保留不受限制。
参见 LICENSE。
| ID | 模块 | 检测内容 |
|---|
network-probe | 网络出口探测 | 服务器观察到的公网 IP、ASN、国家/地区/城市、VPN/代理/Tor/托管标志、TLS/HTTP |
webrtc | WebRTC | 通过 STUN 获取的公网 IPv4 + IPv6、RFC1918 泄露、mDNS 混淆的 .local 候选地址 |
browser-fingerprint | 浏览器指纹 | UA、屏幕、时区、插件、CPU 核心数、设备内存、语言列表、DNT、Cookie |
canvas-fingerprint | Canvas / WebGL | 2D + WebGL 渲染器/供应商字符串、文本渲染特性、支持的图像格式 |
audio-fingerprint | 音频 | AudioContext 采样率、通道数、延迟、振荡器输出哈希 |
font-detection | 字体 | 通过 Canvas 宽度差异检测 40+ 种命名字体探针 |
dns | DNS | DoH 可达性、DNSSEC 信号、解析器地理位置、DNS 泄露启发式检测 |
cdp-detection | 自动化/无头浏览器 | navigator.webdriver、CDP 时间、Chromium 独有 API 表面、端口探测 — 置信度 0–1 |
POST /api/detect/scans 接受 Idempotency-Key 头部,每个用户最多保存 200 次扫描,保存速率限制为 10 次/小时。node:22-alpine 的多阶段构建,Next.js standalone 输出,通过 .github/workflows/ 下的工作流部署到 Kubernetes。| 路径 | 用途 |
|---|
/ | 营销落地页(极光英雄区、功能卡片、FAQ、行动号召) |
/app | 检测器 — 模块列表 + 结果面板 + 概览 |
/login | 独立登录页面(Google / 邮件 / API 密钥) |
/scans | 已登录用户的扫描历史保存记录 |
/scans/[id] | 单次保存扫描的详情 |
/scans/analytics | 分布 / 重复 / 时间线 / 异常值 / 比较 |
/integrations | 管理 det_… API 密钥(创建 / 撤销 / 使用说明) |
/scans/[id] 查看,贡献给分析聚合结果,并计入唯一性查询。| 层 | 组件 |
|---|
| 框架 | Next.js 14(App Router,全 force-dynamic),React 18 |
| 语言 | TypeScript 5,严格模式 |
| UI | Tailwind CSS 3、基于 Radix 的 shadcn/ui 基础组件、Lucide 图标、Framer Motion |
| 认证 | NextAuth 4(Google OAuth + 魔法链接邮件)+ Prisma 适配器 |
| 数据 | Prisma 6 → MySQL(自定义客户端输出于 .prisma/detect-client) |
| 验证 | Zod |
| 测试 | Jest 29 + ts-jest + jsdom |
| 构建/部署 | 多阶段 Dockerfile、Next.js standalone、Kubernetes 清单 |