Supabaseプロジェクトを OWASP Top 10:2025 の45項目などでチェック
プロジェクトを1つ読み取り専用で接続すると、評価付きのレポートと指摘ごとの修正方法が、このページにそのまま表示されます。
Lovable、Bolt、Cursor、v0 で Supabase のアプリを作るチーム向け。無料、登録不要。
無料、登録不要。読み取り専用で、プロジェクトの内容は一切変更されません。
- Supabase を接続supabase.com で読み取り専用のアクセスを承認します。
- 45項目をチェックアクセスと RLS、サインイン、ストレージと関数、インフラ。カタログと設定のみで、行のデータは読み取りません。
- レポートと AI エージェント用のプロンプト指摘ごとの修正方法と、Cursor、Claude Code、Lovable に貼り付けるプロンプト。共有した場合にのみ保存されます。
Supabase プロジェクトを読み込んでいます…
スキャンするプロジェクトを選択
小文字20文字。supabase.com/dashboard/project/your-ref の your-ref の部分です。
人間であることを確認
自動化されたスキャンがサービスに負荷をかけるのを防ぎます。
スキャンログ
チェックで確認できる内容
読み取るもの
- データベースのカタログ: テーブル、RLS フラグ、ポリシー、権限、ビュー、関数、拡張機能、ロール、Vault の読み取り権限
- auth の設定: パスワードルール、メール確認、MFA、リダイレクト URL
- Storage: バケットの一覧、公開されているバケット、サイズとファイル形式の制限
- Edge Functions: 一覧と、それぞれの JWT 設定
- プロジェクト設定: Postgres のバージョン、バックアップ、SSL、ネットワーク制限、Data API の行数上限
読み取らないもの
- テーブル内の行
- API キーとシークレット: Supabase は設定のレスポンスにその一部を含めますが、スキャンは受信した時点で破棄し、保存・ログ記録・表示は一切しません
- バケットに保存されたファイル
- アプリのコードとリポジトリ
レポートは、共有リンクを作成したときだけ、最長7日間保存されます。付与されたアクセス権は、チェックの直後に取り消されます。
読み取りアクセスでは確認できないこと
- A06 安全でない設計 と A10 例外的な状況への不適切な対処 は、プロジェクト設定ではなく、アプリのコードにあります。
- フロントエンドの依存関係 (A03 のうち npm の部分) と、フロントエンドのコードに含まれた service_role キーです。リポジトリで確認してください。
- アプリのコードや Edge Functions の中だけにあるアクセスルール (フロントエンドでの plan = 'pro' のチェックなど)。スキャンが見るのはデータベース自身がポリシー・関数・auth hook で使う列だけなので、書き換え可能なアクセス用の列で合格でも、その列が安全とは限りません。
- サインイン中のあるユーザーが、別のユーザーの行を読み取れるかどうか。これには、実在する2人のユーザーによるテストが必要です: Supabase の RLS をテストする方法
Supabase Security Advisor とこのチェック
| 観点 | Security Advisor | このチェック |
|---|---|---|
| 実行する場所 | Supabase ダッシュボード上で、1回に1プロジェクト | このページ上で、読み取り専用の OAuth 認可のあと、選んだプロジェクトに対して実行 |
| 読み取る内容 | データベースの lint | 同じ lint を1つのチェックとして実行し、さらに auth、storage、Edge Functions、バックアップ、ネットワーク設定も確認 |
| 結果のまとめ方 | lint ごと | OWASP Top 10:2025 のカテゴリごと。チェックできないカテゴリも明記 |
| 修正のために得られるもの | lint のドキュメントへのリンク | 指摘ごとの SQL またはダッシュボードの設定と、AI エージェント向けのプロンプト |
| 残せるもの | ダッシュボード上の一覧 | PDF、または7日で失効する共有リンク |
OWASP Top 10:2025 のカバー範囲
| カテゴリ | チェック数 | 状況 |
|---|---|---|
| A01 アクセス制御の不備 | 18 | 対応 |
| A02 セキュリティの設定ミス | 9 | 対応 |
| A03 ソフトウェアサプライチェーンの不備 | 2 | 一部対応 Postgres のバージョンと拡張機能のみ。npm の依存関係はリポジトリ側にあります。 |
| A04 暗号化の失敗 | 4 | 対応 |
| A05 インジェクション | 1 | 対応 |
| A06 安全でない設計 | 0 | チェック不可 安全でない設計は、設定ではなく、アプリの動作そのものにあります。 |
| A07 認証の失敗 | 8 | 対応 |
| A08 ソフトウェアまたはデータの整合性の不備 | 1 | 対応 |
| A09 セキュリティログとアラートの不備 | 2 | 対応 |
| A10 例外的な状況への不適切な対処 | 0 | チェック不可 例外処理はアプリのコードにあり、読み取りアクセスでは確認できません。 |
全45項目のチェック
| チェック | ID | OWASP | 最悪の場合 |
|---|---|---|---|
| 公開されたテーブルで RLS が無効 | rls_disabled_exposed | A01 | 緊急 |
| すべての行を許可するポリシー | policy_always_true | A01 | 高 |
| ユーザーメタデータを信頼するポリシー | policy_uses_user_metadata | A01 | 高 |
| 匿名の訪問者に開かれた書き込みポリシー | anon_write_policies | A01 | 高 |
| RLS を迂回するビュー | views_without_security_invoker | A01 | 高 |
| API に公開されたマテリアライズドビューまたは外部テーブル | matviews_or_foreign_tables_exposed | A01 | 中 |
| API から呼び出せる security definer 関数 | security_definer_executable | A01 | 高 |
| 匿名の訪問者に開かれたストレージポリシー | storage_objects_anon_policies | A01 | 高 |
| 公開されたストレージバケット | public_buckets | A01 | 低 |
| 保護されていない Realtime のプライベートチャンネル | realtime_messages_rls | A01 | 高 |
| 匿名の訪問者に残っている未使用の書き込み権限 | anon_table_grants_write | A01 | 低 |
| RLS をバイパスするロール | roles_bypass_rls | A01 | 高 |
| サインイン中のユーザーが変更できるアクセス用の列 | authz_columns_writable | A01 | 高 |
| 削除と再挿入で保護された列が変わる | delete_insert_bypass | A01 | 高 |
| サインイン中のユーザーに不要なテーブル権限 | authenticated_table_grants_extra | A01 | 低 |
| 新しいオブジェクトを API に開くデフォルト権限 | default_privileges_api_roles | A01 | 低 |
| current_user を確認する security definer 関数 | definer_checks_current_user | A01 | 中 |
| ロールやコマンドを指定していないポリシー | policies_without_to_or_for | A01 | 低 |
| Supabase Security Advisor の指摘 | advisor_lints | A02 | 高 |
| Data API に公開された余分なスキーマ | extra_exposed_schemas | A02 | 高 |
| リダイレクト URL のワイルドカード | redirect_wildcards | A02 | 中 |
| http や localhost を使うリダイレクト URL | insecure_redirect_urls | A02 | 中 |
| 匿名サインインが有効 | anonymous_signins_enabled | A02 | 中 |
| サインアップとサインインで CAPTCHA がオフ | captcha_disabled | A02 | 中 |
| すべての IP アドレスに開かれたデータベース | network_open | A02 | 中 |
| アップロード制限のない公開バケット | public_bucket_no_limits | A02 | 低 |
| Data API の応答に行数の上限がない | postgrest_max_rows | A02 | 中 |
| Postgres のアップグレードが利用可能 | postgres_upgrade_available | A03 | 中 |
| インストール済みの拡張機能 | extensions_listed | A03 | 情報 |
| データベース接続で SSL が強制されていない | ssl_enforcement_off | A04 | 中 |
| 有効期間が1時間を超えるアクセストークン | jwt_expiry_long | A04 | 中 |
| 匿名の訪問者が読み取れる機密に見える列 | sensitive_columns_exposed | A04 | 高 |
| API ロールから読める Vault のシークレット | vault_secrets_exposed | A04 | 緊急 |
| 文字列から組み立てた動的 SQL | dynamic_sql_concat | A05 | 中 |
| パスワードの最小文字数が短い | password_min_length | A07 | 高 |
| 漏えいパスワードの保護がオフ | leaked_password_protection_off | A07 | 中 |
| メール確認がオフ | email_confirm_off | A07 | 高 |
| セキュアなメールアドレス変更がオフ | secure_email_change_off | A07 | 中 |
| 有効期間が1時間を超えるワンタイムコード | otp_expiry_long | A07 | 中 |
| 多要素認証の方式が有効になっていない | mfa_unavailable | A07 | 中 |
| リフレッシュトークンのローテーションがオフ | refresh_token_rotation_off | A07 | 中 |
| 再認証なしのパスワード変更 | password_change_no_reauth | A07 | 低 |
| JWT 検証のない Edge Functions | edge_functions_without_jwt | A08 | 低 |
| pgaudit が未インストール | pgaudit_missing | A09 | 情報 |
| バックアップが見つからない | backups_or_pitr | A09 | 中 |
よくある質問
Supabase の Security Advisor とは何が違いますか?
Security Advisor の結果は、このチェックの一部です。このスキャンは、auth の設定、storage のポリシー、Edge Functions、バックアップ、ネットワーク設定を加え、すべてを OWASP Top 10:2025 ごとにまとめ、指摘ごとに修正方法を示します。
Supabase はデフォルトで安全ですか?
プラットフォームは Supabase が保守しますが、アクセスルールはお客様の責任です。通常の SQL で作成した新しいテーブルは Row Level Security が無効で、using (true) と書いたポリシーがあると、anon キーを持つ人なら誰でもそのテーブルを読み取れます。スキャンはまさにこうした設定を探します。
「RLS が無効」とはどういう意味で、どう有効にしますか?
公開されたスキーマのテーブルで RLS が無効だと、anon キーを持つ人なら誰でも Data API 経由ですべての行を読み取れます。alter table public.your_table enable row level security; で有効にし、そのうえで必要なアクセス用のポリシーを追加してください。
Supabase の anon キーがブラウザーにあっても安全ですか?
はい。anon (publishable) キーは公開される前提のものです。できるのは権限と RLS ポリシーが許可する範囲だけなので、スキャンはそこを確認します。service_role キーは RLS を迂回するため、ブラウザーに渡してはいけません。
自分のプロジェクトをチェック
無料で読み取り専用。レポートはこのページに表示されます。
自分の Supabase プロジェクトをチェック