FixVibe
Covered by FixVibehigh

Zabezpieczanie Next.js + Supabase: Zapobieganie obejściom zabezpieczeń na poziomie wiersza (RLS)

Aplikacje zbudowane przy użyciu Next.js i Supabase często korzystają z zabezpieczeń na poziomie wiersza (RLS) w celu ochrony danych. Brak włączenia RLS lub błędna konfiguracja klienta Supabase może prowadzić do pełnego ujawnienia bazy danych, umożliwiając nieautoryzowanym użytkownikom odczytywanie lub modyfikowanie poufnych rekordów.

CWE-284

Wpływ

Osoby atakujące mogą ominąć logikę aplikacji w celu odczytu, aktualizacji lub usunięcia rekordów w bazie danych, jeśli zabezpieczenia na poziomie wiersza (RLS) nie są odpowiednio egzekwowane [S1]. Często skutkuje to ujawnieniem informacji umożliwiających identyfikację użytkownika (PII) lub wrażliwych danych aplikacji użytkownikom, którzy mają dostęp jedynie do publicznego anonimowego klucza API.

Główna przyczyna

Supabase wykorzystuje Postgres Row Level Security do zarządzania dostępem do danych na poziomie bazy danych, co jest podstawą zabezpieczenia danych [S1]. W środowisku Next.js programiści muszą utworzyć klienta Supabase, który poprawnie obsługuje pliki cookie i sesje, aby zachować bezpieczeństwo podczas renderowania po stronie serwera [S2]. Luki w zabezpieczeniach zwykle powstają, gdy:

  • Tabele są tworzone bez włączonej opcji RLS, dzięki czemu są dostępne poprzez publiczny klucz anon [S1].
  • Klient Supabase jest błędnie skonfigurowany w Next.js i nie przekazuje prawidłowo tokenów uwierzytelniających użytkowników do bazy danych [S2].
  • Programiści przypadkowo używają klucza service_role w kodzie po stronie klienta, co omija wszystkie zasady RLS [S1].

Poprawki betonu

  • Włącz RLS: Upewnij się, że dla każdej tabeli w Twojej bazie danych Supabase [S1] są włączone zabezpieczenia na poziomie wiersza.
  • Określ zasady: Utwórz specjalne zasady Postgres dla operacji SELECT, INSERT, UPDATE i DELETE, aby ograniczyć dostęp na podstawie identyfikatora UID użytkownika [S1].
  • Użyj klientów SSR: Zaimplementuj pakiet @supabase/ssr, aby utworzyć klientów w Next.js, którzy poprawnie zarządzają uwierzytelnianiem po stronie serwera i trwałością sesji [S2].

Jak FixVibe to testuje

FixVibe uwzględnia już ten problem podczas sprawdzania wdrożonych aplikacji i repo. Pasywny moduł baas.supabase-rls wykrywa adresy URL Supabase i pary bez kluczy z pakietów JavaScript tego samego pochodzenia, pyta PostgREST o metadane tabeli publicznej i wykonuje ograniczone wybory tylko do odczytu, aby potwierdzić ekspozycję anonimowych danych bez mutowania danych klientów. Skanowania repozytorium uruchamiają również repo.supabase.missing-rls, aby oznaczyć migracje SQL tworzące tabele publiczne bez ENABLE ROW LEVEL SECURITY, a skany tajnych szukają ujawnienia klucza roli usługi, zanim dotrze on do przeglądarki.