supabase-extract-url について
Webアプリのクライアント側コードやローカルファイルからSupabaseプロジェクトのURLを抽出するセキュリティスキルです。URLを検出・検証し、後続のSupabase監査に向けて結果と証拠を保存します。
主な機能
- 01JavaScript・HTML・設定のスキャン
- 02標準ドメインとカスタムドメインの検出
- 03URL形式とAPI応答の検証
- 04複数のSupabaseプロジェクトURLの特定
- 05検出結果と抽出証拠の保存
活用シーン
- 01アプリが使用するSupabaseプロジェクトの特定
- 02後続テスト用のAPIベースURLの確認
- 03ダウンロード済みアプリファイルからのURL抽出
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ yoanbernabeu/ supabase-pentest-skills --skill supabase-extract-urlインストール後、Claude Code で/supabase-extract-urlを入力して読み込まれたか確認します。
詳細
Supabase URL の抽出
🔴 重大:ファイルを段階的に更新する必要があります
最後にまとめてではなく、作業を進めながらコンテキストファイルに書き込む必要があります。
- 発見するたびに、直ちに
.sb-pentest-context.jsonに書き込んでください- 各アクションの前後に
.sb-pentest-audit.logに記録してください- スキルの完了までファイルの更新を待たないでください
- スキルがクラッシュまたは中断された場合でも、それまでのすべての調査結果が保存されている必要があります
これは必須です。段階的な書き込みを怠ることは重大なエラーです。
このスキルは、Web アプリケーションのクライアント側コードから Supabase プロジェクトの URL を抽出します。
このスキルを使用するタイミング
- Supabase の使用を検出した後、正確なプロジェクト URL を取得するとき
- 以降のテストで API のベース URL が必要なとき
- アプリケーションが使用している Supabase プロジェクトを特定するとき
前提条件
- 対象 URL にアクセスできること
- Supabase の使用が検出されている(または使用が疑われる)こと
仕組み
このスキルは、次の場所で URL パターンをスキャンします。
1. JavaScript ソースコード
// Direct URL references
const SUPABASE_URL = 'https://abc123.supabase.co'
createClient('https://abc123.supabase.co', key)
// Environment variable patterns
process.env.SUPABASE_URL
process.env.NEXT_PUBLIC_SUPABASE_URL
import.meta.env.VITE_SUPABASE_URL
2. HTML メタタグとスクリプト
<meta name="supabase-url" content="https://abc123.supabase.co">
<script>
window.SUPABASE_URL = 'https://abc123.supabase.co'
</script>
3. 設定オブジェクト
const config = {
supabase: {
url: 'https://abc123.supabase.co'
}
}
URL パターンの照合
認識されるパターン:
| パターン | 例 |
|---|---|
| 標準 | https://abc123.supabase.co |
| リージョン付き | https://abc123.eu-central-1.supabase.co |
| カスタムドメイン | API エンドポイントのパターンから検出 |
使用方法
基本的な抽出
Extract Supabase URL from https://myapp.example.com
ローカルファイルからの抽出
ソースをダウンロード済みの場合:
Extract Supabase URL from ./dist/assets/
出力形式
═══════════════════════════════════════════════════════════
SUPABASE URL EXTRACTED
═══════════════════════════════════════════════════════════
Project URL: https://abc123def.supabase.co
Project Ref: abc123def
Region: us-east-1 (inferred)
Found in:
├── /static/js/main.abc123.js (line 1247)
│ └── const SUPABASE_URL = 'https://abc123def.supabase.co'
│
└── /static/js/chunk.def456.js (line 89)
└── createClient('https://abc123def.supabase.co', ...)
API Endpoints:
├── REST API: https://abc123def.supabase.co/rest/v1/
├── Auth API: https://abc123def.supabase.co/auth/v1/
├── Storage: https://abc123def.supabase.co/storage/v1/
└── Realtime: wss://abc123def.supabase.co/realtime/v1/
Context updated: .sb-pentest-context.json
═══════════════════════════════════════════════════════════
コンテキストの出力
.sb-pentest-context.json に保存されます:
{
"supabase": {
"project_url": "https://abc123def.supabase.co",
"project_ref": "abc123def",
"region": "us-east-1",
"endpoints": {
"rest": "https://abc123def.supabase.co/rest/v1/",
"auth": "https://abc123def.supabase.co/auth/v1/",
"storage": "https://abc123def.supabase.co/storage/v1/",
"realtime": "wss://abc123def.supabase.co/realtime/v1/",
"functions": "https://abc123def.supabase.co/functions/v1/"
},
"sources": [
{
"file": "/static/js/main.abc123.js",
"line": 1247,
"context": "const SUPABASE_URL = 'https://abc123def.supabase.co'"
}
]
}
}
複数の URL
複数の Supabase URL が見つかった場合:
═══════════════════════════════════════════════════════════
MULTIPLE SUPABASE URLS FOUND
═══════════════════════════════════════════════════════════
⚠️ Multiple Supabase projects detected
1. https://abc123.supabase.co (primary - most references)
└── Found in: main.js, config.js
2. https://xyz789.supabase.co (secondary)
└── Found in: analytics.js
Using primary URL for further analysis.
To use a different URL, specify it manually.
═══════════════════════════════════════════════════════════
検証
このスキルは、次の方法で抽出した URL を検証します。
- 形式の確認 — Supabase URL の想定パターンに一致するか確認します
- 到達可能性の確認 — REST API エンドポイントへの到達を試みます
- 応答の検証 — Supabase に類似した応答であることを確認します
Validation:
├── Format: ✅ Valid Supabase URL format
├── Reachable: ✅ REST API responds (200 OK)
└── Confirmed: ✅ Response matches Supabase pattern
よくある問題
❌ 問題: Supabase の使用が検出されているのに URL が見つからない ✅ 解決策: URL が動的に読み込まれるチャンクに含まれている可能性があります。次を試してください:
Extract URL with deep scan from https://myapp.example.com
❌ 問題: URL は見つかったが、検証に失敗する ✅ 解決策: プロジェクトが一時停止中か、リージョンで接続の問題が発生している可能性があります。URL はそのまま記録されます。
❌ 問題: カスタムドメインしか見つからない ✅ 解決策: カスタムドメインも有効です。このスキルはカスタムドメインとして記録し、基盤となるプロジェクトの特定を試みます。
セキュリティに関する注意事項
- このスキルは公開されているコードのみを読み取ります
- 認証は試みません
- URL だけではアクセスできません(キーも必要です)
次の手順
URL を抽出した後:
supabase-extract-anon-keyを実行して API キーを見つけますsupabase-extract-service-keyを実行して、漏えいしたサービスキーがないか確認します- API 監査スキルに進みます
必須:コンテキストファイルの段階的な更新
⚠️ このスキルは実行中に追跡ファイルを段階的に更新する必要があり、最後にまとめて更新してはいけません。
重要なルール:作業を進めながら書き込む
書き込みを最後にまとめて行わないでください。代わりに:
- アクションを開始する前に → アクションを
.sb-pentest-audit.logに記録します - 発見するたびに →
.sb-pentest-context.jsonを直ちに更新します - 重要な手順が終わるたびに → 完了を
.sb-pentest-audit.logに記録します
これにより、スキルが中断、クラッシュ、またはタイムアウトした場合でも、その時点までの調査結果がすべて保持されます。
必須のアクション(段階的に実行)
-
抽出したデータで
.sb-pentest-context.jsonを更新します:{ "supabase": { "project_url": "https://[ref].supabase.co", "project_ref": "[ref]", "endpoints": { ... } } } -
.sb-pentest-audit.logに記録します:[TIMESTAMP] [supabase-extract-url] [START] Beginning URL extraction [TIMESTAMP] [supabase-extract-url] [SUCCESS] URL extracted: https://[ref].supabase.co [TIMESTAMP] [supabase-extract-url] [CONTEXT_UPDATED] .sb-pentest-context.json updated -
ファイルが存在しない場合は、書き込む前に作成します。
コンテキストファイルを更新しないことは許容されません。
必須:証拠の収集
📁 証拠ディレクトリ: .sb-pentest-evidence/02-extraction/
作成する証拠ファイル
| ファイル | 内容 |
|---|---|
extracted-url.json | ソース内の位置情報を含む URL 抽出の詳細 |
証拠の形式
{
"evidence_id": "EXT-URL-001",
"timestamp": "2025-01-31T10:05:00Z",
"category": "extraction",
"type": "url_extraction",
"extracted_data": {
"project_url": "https://abc123def.supabase.co",
"project_ref": "abc123def",
"region": "us-east-1"
},
"sources": [
{
"file": "/static/js/main.js",
"line": 1247,
"context": "const SUPABASE_URL = 'https://abc123def.supabase.co'"
}
],
"endpoints_discovered": {
"rest": "https://abc123def.supabase.co/rest/v1/",
"auth": "https://abc123def.supabase.co/auth/v1/",
"storage": "https://abc123def.supabase.co/storage/v1/",
"realtime": "wss://abc123def.supabase.co/realtime/v1/"
}
}
関連スキル
supabase-detect— まず Supabase の使用を検出しますsupabase-extract-anon-key— anon キーを抽出しますsupabase-extract-service-key— service キーの漏えいを確認します