
ブラウザのプライバシー漏洩検出器 — 8つの検出モジュール、リスクスコアリング、アカウントごとの履歴をすべてブラウザ内で提供します。
ブラウザのプライバシー漏洩検出器 — 8つの検出モジュール、リスクスコアリング、 アカウントごとの履歴を、すべてブラウザ内で提供します。
Built with Verdent — エージェント型コーディングアシスタント。 すべての検出モジュール、アナリティクスダッシュボード、APIキー認証フロー、 バイリンガルUI、Kubernetes対応のDockerイメージは、Verdentが駆動するペアプログラミングセッションで設計・実装されました。
URLを開き、Run all をクリックすると、数秒以内にLeakishはあなたのブラウザがあなたとあなたのネットワークについて何を漏らしているかを教えてくれます — WebRTC、フィンガープリンティングAPI、DNS、およびサーバーサイドプローブを通じて。8つの独立したモジュールがそれぞれ、型付きの結果+リスクシグナル、集計スコア(0〜100)、およびレベル(safe / warning / critical)を生成します。
サインイン済みユーザーは、スキャンをMySQLに保存し、履歴を閲覧し、分布チャート、フィンガープリントハッシュの重複、IP / ASNタイムライン、外れ値スキャン、ペアワイズ比較を表示するアナリティクスダッシュボードを開くことができます。それ以外のすべて(検出器自体)はアカウントなしで動作します — 誰でも /app にアクセスしてスキャンを実行できます。
各モジュールは単一の型付き DetectionModule<T> インターフェースを通じて登録され、分離して実行されます — 1つのモジュールが例外を投げても他のモジュールには影響しません。モジュールごとの有効状態は localStorage にバージョンキー付きで保持され、リフレッシュ後も維持され、Run all ボタンは有効なモジュールセットのみを実行します。
/api/detect/network にアクセスしてサーバーが観測した自身のIPを読み取る場合、(c) DNSモジュールが https://dns.google/resolve と通信する場合のみです。leakish.locale クッキーに保持され、<html lang>、ページメタデータ、すべての画面、すべてのAPIエラーレスポンス、マジックリンクのサインインメールを制御します。det_… APIキーを作成できます(SHA-256で保存され、平文は一度だけ表示されます)。すべての /api/detect/* エンドポイントはセッションクッキーまたはBearerキーのいずれかを受け付けるため、同じスキャンをCLI / CIジョブから保存できます。/scans/analytics — タイムゾーン / プラットフォーム / 言語 / 画面 / WebGL / ASN / 国 / フォント数にわたる分布チャート、種類別リスクグレード付きのフィンガープリントハッシュ重複、IP / ASNタイムライン、多軸外れ値検出、0〜100の類似度スコアによるペアワイズ比較。lib/risk/assess.ts は安定したID(例: webrtc.public-ip-leak)を持つ型付き RiskSignal、モジュールごとのサマリー、および単一の総合スコアを生成します。 インジェクションによりロケール対応。前提条件: Node 22+(ローカル開発には20+でも動作)、Yarn 1.x、稼働中のMySQLインスタンス、および(オプションで)Google OAuthクライアント。
yarn install
cp env.example .env.local # fill in DATABASE_URL, NEXTAUTH_SECRET, IP_HASH_SALT at minimum
yarn prisma:generate
yarn db:push # provision tables on a fresh DB
yarn dev # http://localhost:3000
サインインを機能させるための最小限のenv:
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)/ # / — Landing (server-resolved auth state + client UI)
├── app/ # /app — the detector page
├── login/ # /login
├── scans/ # /scans, /scans/[id], /scans/analytics
├── integrations/ # /integrations — API key management
├── api/
│ ├── auth/ # NextAuth route + apiKey-login + tests
│ ├── detect/
│ │ ├── analytics/ # aggregate + pairwise-diff
│ │ ├── network/ # server-side egress probe
│ │ ├── scans/ # save / list / get / delete
│ │ └── uniqueness/ # how many users share this fingerprint hash
│ ├── integration/keys # create / revoke / list API keys
│ └── health/ # liveness probe for k8s
├── opengraph-image.tsx # dynamic OG (per-locale)
├── apple-icon.tsx # dynamic apple-touch icon
├── icon.svg # shield gradient
└── layout.tsx # metadata + theme-init script + LocaleProvider
components/
├── modular-detector.tsx # top-level shell (header + module list + result/overview)
├── detector/ # module-list, result-panel, category filter, state hook
├── result-details/ # one detail view per module (typed switch)
├── overview/ # overview panel + diagnostics export
├── auth/ # AuthGateProvider, login dialog, login form
├── providers/ # SessionProvider wrapper
└── ui/ # shadcn-style primitives + theme/locale toggles
lib/
├── detection-modules/ # 8 module impls + ModuleManager + IP utils + tests
├── risk/ # assess.ts — RiskSignal/score aggregation
├── i18n/ # en.ts / zh.ts + Messages type + locale client/server
├── api/ # withDetectAuth wrapper, scan-payload Zod schema
├── client/ # browser-side scan-api (extractFingerprintInputs, saveScan, lookupUniqueness)
├── server/ # network-probe, IP-hash salt, fingerprint hashing, rate-limit, send-email, analytics
├── persistence/ # SSR-safe localStorage wrappers
├── env.ts # runtime env validation
├── logger.ts # dev-only diagnostic logger
└── prisma.ts # singleton client targeted at .prisma/detect-client
prisma/schema.prisma # User / Account / Session / DetectScan / ApiKey / DetectFingerprintHash
/app で Run all をクリックします。検出器は ModuleManager.runAllEnabledModules を使用して有効なモジュールを反復処理します — 各モジュールの失敗は捕捉され分離されるため、他の結果は引き続き表示されます。DetectionResult<T>(success | failure タグとモジュール固有の data を含む)を返します。結果パネルは、型安全な switch を介してモジュールごとの詳細コンポーネントをレンダリングします。lib/risk/assess.ts は各結果を走査し、安定したIDを持つ RiskSignal を生成し、OverallAssessment(スコア + レベル + 件数)を生成します。/api/detect/scans に POST します。サーバーはZodで検証し、独自のネットワークプローブを実行してサーバーが観測したIP / ASN / VPNフラグを記録し、DetectScan 行と DetectFingerprintHash 行を書き込みます。ユニットテストは対象コードと同じ場所の __tests__/ ディレクトリに配置されています:
yarn test # full suite
yarn test path/to/file # single file
yarn test -t "name pattern" # by test-name regex
主な内容:
lib/detection-modules/__tests__/ — IP分類 + mDNS抽出、モジュールマネージャーの登録と失敗の分離、WebRTCモジュール用のモック RTCPeerConnection、ブラウザフィンガープリントモジュールの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-loginルート(CSRF、形式チェック、失効/期限切れ処理、最終使用時刻の更新)。Lint + 型チェック:
yarn lint
npx tsc --noEmit
同梱の Dockerfile は node:22-alpine 上にNext.js standaloneイメージを生成します。本番環境のenvはKubernetes Secretを介して注入されます — プレースホルダー値はビルド時に焼き込まれるため、実行時に SKIP_ENV_VALIDATION は不要です。prisma db push ジョブがロールアウト前にスキーマを実行します。イメージビルド → マイグレーション → ロールアウトの完全なパイプラインは .github/workflows/deploy-tke.yml を参照してください。
このオープンソースビルドにはペイウォールはありません。保存は lib/server/rate-limit.ts のプロセス内ユーザーごとのレートリミッター(1時間あたり10保存)だけで管理され、履歴の保持期間に制限はありません。
LICENSE を参照してください。
| ID | Module | 検査内容 |
|---|
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 |
MessagesPOST /api/detect/scans は Idempotency-Key ヘッダーを受け付け、各ユーザーのスキャンを200件に制限し、保存を1時間あたり10件にレート制限します。node:22-alpine 上のマルチステージビルド、Next.js standalone出力、.github/workflows/ 以下のワークフローを通じてKubernetesにデプロイ。| Path | 目的 |
|---|
/ | マーケティングランディング(オーロラヒーロー、機能カード、FAQ、CTA) |
/app | 検出器 — モジュールリスト + 結果パネル + 概要 |
/login | スタンドアロンのサインインページ(Google / メール / APIキー) |
/scans | サインイン済みユーザーの保存済みスキャン履歴 |
/scans/[id] | 単一の保存済みスキャン詳細 |
/scans/analytics | 分布 / 重複 / タイムライン / 外れ値 / 比較 |
/integrations | det_… APIキーの管理(作成 / 失効 / 使い方) |
/scans/[id] で表示可能になり、アナリティクスの集計に貢献し、ユニーク性ルックアップでカウントされます。| レイヤー | 構成要素 |
|---|
| Framework | Next.js 14(App Router、すべて force-dynamic)、React 18 |
| Language | TypeScript 5、厳格モード |
| UI | Tailwind CSS 3、Radix上のshadcn/uiプリミティブ、Lucideアイコン、Framer Motion |
| Auth | NextAuth 4(Google OAuth + マジックリンクメール)+ Prismaアダプター |
| Data | Prisma 6 → MySQL(.prisma/detect-client へのカスタムクライアント出力) |
| Validation | Zod |
| Tests | Jest 29 + ts-jest + jsdom |
| Build / deploy | マルチステージDockerfile、Next.js standalone、Kubernetesマニフェスト |