ROW LEVEL SECURITY; -- ② 「自分の行だけ」を許可するポリシー CREATE POLICY "Users can only access their own accounts" ON accounts FOR ALL USING (auth.uid() = user_id); auth.uid() = 今アクセスしてきた人のユーザーID(Supabaseが提供) 有効化するとデフォルト拒否。ポリシーが唯一の許可リストになる 現在の公式推奨は USING ((select auth.uid()) = user_id) + user_id にイ ンデックス(大規模テーブルで劇的に速くなる) 合同会社ソネット | Supabase Meetup Tokyo #1 14
delete_one_time_transfer_pair(p_transaction_id UUID) SECURITY DEFINER -- RLSが効かない AS $$ BEGIN SELECT * INTO v_tx FROM one_time_transactions WHERE id = p_transaction_id; -- ↑ 所有者チェックが 1行もない DELETE FROM one_time_transactions WHERE transfer_pair_id = ...; 関数は PostgRESTのRPCとして外からも直接呼べる(アプリ画面は素通り) 読まれる穴ではなく、書かれる・消される穴。UUIDを知れば他人の取引を消せる アプリ経由の正規ルートは安全。だがRLSの境界は関数の外で破れている 合同会社ソネット | Supabase Meetup Tokyo #1 20