メインコンテンツへスキップ
友田 陽大

無料ツール · ブラウザ完結 · @aegiskit

あなたの RLS は「認証」で止まっていないか、その場で判定

RLS ポリシーの SQL を貼るだけ。「ログイン済みか」しか見ていない(=全ユーザーが全行を読める)ポリシーを、所有者スコープの正しい形と区別して即座に分類します。存在チェックではなく、正しさのチェックです。

SQL はこのブラウザから出ません(ネットワーク送信なし)

例を読み込む:

判定結果

上に CREATE POLICY 文を貼るか、例を読み込んでください。判定はこのブラウザ内で即座に行われます。

「所有者スコープでない」=「脆弱」ではありません。共有・参照テーブルでは認証のみが正しい設計です。これは意図の確認を促す中程度の指標で、確定した脆弱性ではありません。判定は保守的(fail-secure)で、確信が持てない述語は警告しません。正式な解析は npx @aegiskit/cli scan(コード横断+CI)が担います。

仕組み

「存在」ではなく「正しさ」を見る

多くのスキャナは「RLS が有効か」しか見ません。このツールは述語の意味を分類し、認証だけのポリシーを所有者スコープと区別します。

  1. 1

    肯定的なゲートで判定

    「穴」は auth.uid()/auth.jwt() IS NOT NULL か auth.role() = 'authenticated' だけと定義。service_role・JWT クレーム・引用符付き識別子・カスタム関数は抑制します。

  2. 2

    所有者束縛を認識

    auth.uid() = user_id、キャスト、(select auth.uid()) の性能ラッパ、IN (col, col) の参加者束縛、大小無視のメール一致まで正しく「安全」と分類します。

  3. 3

    迷ったら警告しない

    確信の持てない述語は fail-secure で抑制。誤検知(オオカミ少年)を出さないことが、ツールを信頼してもらう条件です。

プライバシー

あなたの SQL は、このブラウザから一歩も出ません

  • 分類は 100% クライアントサイド(あなたの端末内)で実行されます。サーバーへの送信・保存・ログは一切ありません。
  • デプロイ済みのアプリを叩くこともありません。静的なテキスト解析のみで、稼働中のシステムには接触しません。
  • これは Aegis の CLI(1,000 リポで precision 1.0 を検証)の分類ロジックを移植した軽量プレビューです。

リポジトリ全体を、CI で継続的にチェックする

このプレビューは 1 つのポリシーを見ます。CLI は supabase/migrations 全体とあなたの Next.js コードを横断し、SARIF を GitHub に出力、CI で高信頼の所見だけをブロックします。設計そのものの検証が必要になったら、有料監査へ。

npx @aegiskit/cli scan

インストール不要・設定不要。ローカルで実行し、稼働中アプリには接触しません。

github.com/tomodahinata/aegis

FAQ

  • 貼り付けた SQL はどこかに送られますか?

    いいえ。判定は完全にあなたのブラウザ内で実行され、SQL がネットワークに送られることはありません。稼働中のアプリにも接触しません(静的解析のみ)。

  • auth.role() = 'authenticated' の何が問題ですか?

    ログイン済みであることしか証明しません。つまり全ログインユーザーが全行を読めます。所有者に絞るには auth の識別子を所有者列に束縛します:using (auth.uid() = user_id)。意図的な共有テーブルなら認証のみでも適切です。

  • 「認証のみ」=「脆弱」ですか?

    いいえ。共有・参照テーブルでは正しい設計です。この判定は「意図を確認してください」という中程度の指標で、確定した脆弱性ではありません。

  • CLI と何が違いますか?

    これは 1 つの述語を見る軽量プレビューです。npx @aegiskit/cli scan は supabase/migrations 全体とあなたの Next.js コードを横断し、SARIF を出力し CI に統合し、INSERT/UPDATE/DELETE の書き込み側まで検査します。CLI が正式なツールです。