FixVibe
Covered by FixVibehigh

Захист Next.js + Supabase: запобігання обходу безпеки на рівні рядків (RLS)

Програми, створені за допомогою Next.js і Supabase, часто покладаються на захист на рівні рядків (RLS) для захисту даних. Неможливість увімкнути RLS або неправильне налаштування клієнта Supabase може призвести до повного розкриття бази даних, що дозволить неавторизованим користувачам читати або змінювати конфіденційні записи.

CWE-284

Вплив

Зловмисники можуть обійти логіку програми, щоб прочитати, оновити або видалити записи в базі даних, якщо безпека на рівні рядка (RLS) не застосовується належним чином [S1]. Це часто призводить до розголошення особистої інформації (PII) або конфіденційних даних програми користувачам, які мають доступ лише до публічного анонімного ключа API.

Основна причина

Supabase використовує Postgres Row Level Security для керування доступом до даних на рівні бази даних, що є фундаментальним для захисту даних [S1]. У середовищі Next.js розробники повинні створити клієнт Supabase, який правильно обробляє файли cookie та сеанси, щоб підтримувати безпеку під час відтворення [S2] на стороні сервера. Уразливі місця зазвичай виникають, коли:

  • Таблиці створюються без увімкнення RLS, що робить їх доступними за допомогою загальнодоступного ключа [S1].
  • Клієнт Supabase неправильно налаштований у Next.js, не в змозі належним чином передавати маркери автентифікації користувача до бази даних [S2].
  • Розробники випадково використовують ключ service_role у коді на стороні клієнта, який обходить усі політики RLS [S1].

Конкретні виправлення

  • Увімкнути RLS: переконайтеся, що безпеку на рівні рядків увімкнено для кожної таблиці у вашій базі даних Supabase [S1].
  • Визначте політики: створіть спеціальні політики Postgres для операцій SELECT, INSERT, UPDATE і DELETE, щоб обмежити доступ на основі UID користувача [S1].
  • Використовуйте клієнти SSR: запровадьте пакет @supabase/ssr для створення клієнтів у Next.js, які правильно керують автентифікацією на стороні сервера та збереженням сеансу [S2].

Як FixVibe перевіряє це

FixVibe уже покриває це через перевірки розгорнутих програм і репо. Пасивний модуль baas.supabase-rls виявляє пари URL-адреси Supabase і анонімного ключа з однакових пакетів JavaScript, запитує у PostgREST метадані загальнодоступної таблиці та виконує обмежений вибір лише для читання, щоб підтвердити доступ до анонімних даних без зміни даних клієнтів. Сканування репо також запускає repo.supabase.missing-rls, щоб позначати міграції SQL, які створюють загальнодоступні таблиці без ENABLE ROW LEVEL SECURITY, а секретні сканування шукають розкриття ключа ролі служби, перш ніж він досягне браузера.