Dampak
Kegagalan menerapkan Keamanan Tingkat Baris (RLS) memungkinkan penyerang yang tidak diautentikasi untuk menanyakan data dari database Supabase ketika tabel publik diekspos melalui batas langsung [S1]. Karena aplikasi Next.js biasanya mengekspos kunci Supabase anon dalam kode sisi klien, penyerang dapat menggunakan kunci ini untuk membuat panggilan REST API langsung ke database, melewati logika aplikasi yang dimaksudkan dan mengakses informasi sensitif pengguna [S2].
Akar Penyebab
Secara default, tabel Postgres di Supabase memerlukan aktivasi eksplisit Keamanan Tingkat Baris untuk mencegah akses publik [S1]. Ketika pengembang membuat tabel tetapi lupa mengaktifkan RLS atau gagal menentukan kebijakan yang membatasi, database dapat mengekspos data kepada siapa pun yang memiliki kunci anon proyek [S1]. Dalam aplikasi Next.js, rendering sisi server dan pengambilan sisi klien juga memerlukan pengaturan klien Supabase yang cermat sehingga konteks pengguna yang diautentikasi mencapai lapisan database [S2].
Perbaikan Beton
- Aktifkan RLS: Jalankan
ALTER TABLE "your_table_name" ENABLE ROW LEVEL SECURITY;untuk setiap tabel publik yang menyimpan data aplikasi [S1]. - Tentukan Kebijakan: Buat kebijakan khusus yang membatasi akses berdasarkan status autentikasi pengguna, seperti
CREATE POLICY "Users can see their own data" ON your_table_name FOR SELECT USING (auth.uid() = user_id);[S1]. - Klien Sisi Server yang Aman: Saat menggunakan Next.js, pertahankan klien peran layanan hanya di server dan tetap terapkan filter kepemilikan sebelum mengembalikan data ke pengguna [S2].
Bagaimana FixVibe mengujinya
FixVibe sudah menjalankan pemeriksaan Supabase RLS hanya baca melalui baas.supabase-rls. Pemindai menemukan URL proyek Supabase dan kunci publik langsung dari bundel JavaScript asal yang sama, meminta PostgREST untuk metadata tabel publik, dan mencoba pemilihan hanya baca terbatas untuk mengonfirmasi apakah data diekspos tanpa sesi pengguna. Itu tidak menyisipkan, memperbarui, menghapus, atau menggunakan kredensial peran layanan. Pemindaian repo juga dapat menangkap ini sebelumnya melalui repo.supabase.missing-rls, yang menandai migrasi SQL yang membuat tabel publik tanpa ENABLE ROW LEVEL SECURITY.
