FixVibe
Covered by FixVibehigh

Melindungi Next.js + Supabase: Menghalang Keselamatan Tahap Baris (RLS) Pintasan

Aplikasi yang dibina dengan Next.js dan Supabase selalunya bergantung pada Keselamatan Tahap Baris (RLS) untuk melindungi data. Kegagalan untuk mendayakan RLS atau salah konfigurasi klien Supabase boleh membawa kepada pendedahan pangkalan data penuh, membenarkan pengguna yang tidak dibenarkan membaca atau mengubah suai rekod sensitif.

CWE-284

Kesan

Penyerang boleh memintas logik aplikasi untuk membaca, mengemas kini atau memadam rekod dalam pangkalan data jika Keselamatan Tahap Baris (RLS) tidak dikuatkuasakan dengan betul [S1]. Ini selalunya mengakibatkan pendedahan Maklumat Pengenalan Peribadi (PII) atau data aplikasi sensitif kepada pengguna yang hanya mempunyai akses kepada kunci API tanpa nama awam.

Punca Punca

Supabase menggunakan Postgres Row Level Security untuk mengurus akses data pada peringkat pangkalan data, yang merupakan asas untuk mendapatkan data [S1]. Dalam persekitaran Next.js, pembangun mesti mencipta klien Supabase yang mengendalikan kuki dan sesi dengan betul untuk mengekalkan keselamatan semasa pemaparan sebelah pelayan [S2]. Kerentanan biasanya timbul apabila:

  • Jadual dibuat tanpa RLS didayakan, menjadikannya boleh diakses melalui kunci anon awam [S1].
  • Pelanggan Supabase salah konfigurasi dalam Next.js, gagal menghantar token pengesahan pengguna dengan betul kepada pangkalan data [S2].
  • Pembangun secara tidak sengaja menggunakan kunci service_role dalam kod sisi klien, yang memintas semua dasar RLS [S1].

Pembetulan Konkrit

  • Dayakan RLS: Pastikan Keselamatan Tahap Baris didayakan untuk setiap jadual dalam pangkalan data Supabase anda [S1].
  • Tentukan Dasar: Cipta dasar Postgres khusus untuk operasi SELECT, INSERT, UPDATE dan DELETE untuk mengehadkan capaian berdasarkan UCI4ZCVIX pengguna.
  • Gunakan Klien SSR: Laksanakan pakej @supabase/ssr untuk mencipta klien dalam Next.js yang mengurus pengesahan sisi pelayan dan ketekunan sesi [S2] dengan betul.

Bagaimana FixVibe mengujinya

FixVibe sudah merangkumi perkara ini melalui semakan apl dan repo yang digunakan. Modul baas.supabase-rls pasif menemui URL Supabase dan pasangan kekunci anon daripada berkas JavaScript asal yang sama, meminta PostgREST untuk metadata jadual awam dan melakukan pilihan baca sahaja terhad untuk mengesahkan pendedahan data tanpa nama tanpa mengubah data pelanggan. Imbasan Repo juga menjalankan repo.supabase.missing-rls untuk membenderakan migrasi SQL yang mencipta jadual awam tanpa ENABLE ROW LEVEL SECURITY dan imbasan rahsia mencari pendedahan utama peranan perkhidmatan sebelum ia mencapai penyemak imbas.