😱
Supabase で RLS を設定しないとヤバい話
🔥 何がヤバいの?
Supabase の RLS(Row Level Security)を有効にしていないと、以下のようなことが簡単に起きてしまいます:
- 他人のデータが勝手に見れる
- 他人のデータを勝手に編集できる
- 最悪、全データを削除される
たとえば、ユーザーのメールアドレスや名前などの個人情報が入っていた場合、情報漏洩や不正利用のリスクが一気に高まります。
🧩 影響するパターン・しないパターン
✅ 影響しないパターン
以下のような構成の場合は、RLSのリスクが比較的低いです:
- API 経由でのみデータベースにアクセスしている(サーバーサイド処理)
- Drizzle ORM や Prisma などを使っている(安全なORM管理)
❌ 影響するパターン
危険なのは次のような構成です:
- Supabase クライアント(例:
@supabase/supabase-js)をフロントエンドから直接使っている - なおかつ、RLSルールをまったく設定していない
この場合、すべてのテーブルに対して誰でもアクセス可能な状態になっていることがあります。
つまり、悪意あるユーザーが API (PostgREST) 経由で好き放題できてしまうわけです。
✅ 今すぐやるべき対策
まずは RLS(Row Level Security)を有効化しましょう。
そのうえで、自分のプロジェクトに合ったルールを追加しましょう。
たとえば、user_id フィールドが存在するテーブルで、認証ユーザー本人だけがアクセスできるようにするには、こんなルールがよく使われます:
(auth.uid() = user_id)
このルールは、ログイン中のユーザーの UID(auth.uid())と、テーブル内の user_id が一致したときだけ操作を許可するものです。
Supabase Auth や Clerk を使っている場合でも、このようなルールで制限が可能です。
📝 まとめ
- Supabase で RLS を設定していないと、全ユーザーのデータにアクセスできてしまう可能性がある
- フロントエンドから直接 Supabase にアクセスしている場合は、特に注意が必要
- RLS を有効化して、プロジェクトに適したルールを設定しよう
Supabase は本当に便利なサービスですが、適切な設定行わないと、セキュリティリスクがとても大きくなります。
安心・安全に Supabase を使うためにも、RLS の設定を今一度チェックしてみてください!
Discussion