Jak działa ten test
Aplikacje zbudowane w Lovable, Bolt czy v0 zwykle łączą się z Supabase bezpośrednio z przeglądarki, więc adres Twojego projektu i jego klucz publiczny (anon lub sb_publishable_…) są w Twoim JavaScripcie. To normalne: ten klucz ma być publiczny. Scanaris je znajduje, pyta API Supabase, jakie tabele udostępnia, i dla każdej wysyła żądanie HEAD z Prefer: count=exact. Odpowiedź zawiera liczbę wierszy widocznych dla odwiedzającego bez sesji i żadnych danych. Jeśli API nie publikuje listy tabel, sprawdzane są nazwy najczęściej używane przez narzędzia AI (profiles, users, orders, messages…). W Firebase test sprawdza, czy korzeń Realtime Database odpowiada na odczyt bez sesji.
Co oznacza wynik
Tabelę, w której anonimowo widać więcej niż zero wierszy, może odczytać każdy, kto otworzy Twoją stronę: jedno żądanie z kluczem publicznym i ma całą tabelę. To dokładnie schemat podatności Lovable (CVE-2025-48757). Przy włączonym Row Level Security i rozsądnych zasadach anonimowy odwiedzający widzi zero wierszy, dlatego „0” nigdy nie daje wyniku.
Jak to naprawić w Supabase
Znajdź tabele bez RLS, włącz je i napisz jedną zasadę na operację. Publiczny odczyt zostaw tylko tam, gdzie dane naprawdę są publiczne (blog, katalog produktów).
-- Tables in the public schema without RLS
select c.relname
from pg_class c
join pg_namespace n on n.oid = c.relnamespace
where n.nspname = 'public' and c.relkind = 'r' and not c.relrowsecurity;
alter table public.profiles enable row level security;
create policy "profiles: own rows" on public.profiles
for select to authenticated
using ((select auth.uid()) = id);
Jak to naprawić w Firebase
Zastąp reguły trybu testowego regułami, które domyślnie wszystkiego zabraniają i otwierają tylko to, co należy do danego użytkownika:
{
"rules": {
".read": false,
".write": false,
"users": {
"$uid": {
".read": "auth != null && auth.uid === $uid",
".write": "auth != null && auth.uid === $uid"
}
}
}
}
Instrukcję krok po kroku znajdziesz w przewodniku po Supabase i przewodniku po Firebase.
Najczęściej zadawane pytania
Czy Scanaris czyta moje dane?
Nie. Odczytuje tylko liczbę wierszy, którą API zwraca w nagłówku; żądania nie przynoszą zawartości tabel i nic nie jest zapisywane.
Czy mogę zamiast tego ukryć klucz publiczny?
Nie i nie trzeba: przeglądarka potrzebuje go do komunikacji z Supabase. Twoje dane chroni RLS, a nie ukrywanie klucza.