// docs / baas security / firebase rules scanner
Skener Firebase pravila: pronađite otvorena Firestore, Realtime Database i Storage pravila
Firebase aplikacije padaju u sigurnosti na jedan konzistentan način: <code>allow read, write: if true;</code> pravila preostala iz test-mode quickstarta, nikada zamijenjena prije produkcije. AI alati za kodiranje generiraju ova pravila doslovno iz primjera dokumentacije i rijetko potiču developera da ih otvrdne. Ovaj članak pokazuje kako skener Firebase pravila detektira otvorena pravila u Firestoreu, Realtime Databaseu i Cloud Storageu izvan projekta — i kako popraviti ono što pronađe.
Kako skener pronalazi otvorena Firebase pravila
Firebase servisi izlažu poznate, predvidljive URL oblike. Skener bez vjerodajnica može ispitati svaki i promatrati uspijevaju li anonimna čitanja. FixVibe-ova provjera baas.firebase-rules radi u tri neovisne probe — jedna po Firebase servisu:
- <strong>Firestore.</strong> The scanner extracts the project ID from the deployed app's bundle (it's in <code>firebase.initializeApp({ projectId: ... })</code>), then issues <code>GET https://firestore.googleapis.com/v1/projects/[project-id]/databases/(default)/documents/[collection]:listDocuments</code> against common collection names. A <code>200 OK</code> with documents in the response means <code>allow read</code> is permissive.
- Realtime Database. Skener ispituje
https://[project-id]-default-rtdb.firebaseio.com/.json. Ako je korijen anonimno čitljiv, odgovor je cijelo stablo baze kao JSON. Konzervativniji test upituje.json?shallow=true, što vraća samo ključeve na najvišoj razini — i jedno i drugo je nalaz. - Cloud Storage. Skener upituje
https://firebasestorage.googleapis.com/v0/b/[project-id].appspot.com/o. Ako odgovor popisuje imena datoteka bez autentifikacije, bucket je anon-listable. Listable storage je nalaz čak i kada su preuzimanja pojedinačnih datoteka zabranjena — napadači nabrajaju bucket da pronađu nazive koji se mogu pogoditi.
Kako footgun test-modea zaista izgleda
Firebase quickstart dokumentacija uključuje jedan od najkopiranijih blokova pravila na internetu:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}Firebase je nekada dodavao automatski 30-dnevni istek na ova pravila. To se promijenilo: danas pravila ostaju zauvijek osim ako ih developer ne zamijeni. AI alati za kodiranje — trenirani na godinama dokumentacije koja uključuje test-mode blok — često ih emitiraju doslovno i govore developeru "ovo je vaše sigurnosno pravilo". To nije.
Druge varijante koje se pojavljuju u produkciji, ali su jednako permisivne:
// future-date variant — equivalent to "if true" allow read, write: if request.time < timestamp.date(2099, 1, 1); // authenticated-user variant — any signed-in user reads and writes anything allow read: if true; allow write: if request.auth != null; // any-auth variant — any signed-in user owns every document allow read, write: if request.auth != null;
- Varijanta s budućim timestampom: pravilo koje dopušta sve do datuma daleko u budućnosti. Nikad efektivno ne istječe (vidi istaknuti blok iznad).
allow read: if true; allow write: if request.auth != null;— javna čitanja, svaki autenticirani korisnik može pisati.allow read, write: if request.auth != null;— svaki prijavljeni korisnik može čitati ili pisati bilo koji dokument, uključujući podatke drugih korisnika.
Što učiniti kada skener pronađe otvoreno pravilo
Otvorena Firebase pravila su runtime hitnost. Popravak je istog oblika u sva tri servisa: ograničite svako pravilo na request.auth.uid u odnosu na eksplicitno polje vlasnika. Svaki servis ima svoju sintaksu pravila:
Firestore
match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. Vezivanje segmenta putanje {userId} postaje jedini dokument koji korisnik može dotaknuti.
match /users/{userId} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}Realtime Database
<code>{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }</code>. The <code>$uid</code> wildcard captures the path segment for comparison.
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}Cloud Storage
service firebase.storage { match /b/{bucket}/o { match /users/{userId}/{allPaths=**} { allow read, write: if request.auth.uid == userId; } } }. Konvencija: pohranjujte datoteke pod users/[uid]/[filename] i neka putanja primjenjuje vlasništvo.
service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/{allPaths=**} {
allow read, write: if request.auth.uid == userId;
}
}
}Deployajte pravila preko Firebase CLI: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Provjerite jesu li nova pravila u produkciji ponovnim pokretanjem FixVibe skena — nalaz baas.firebase-rules trebao bi nestati.
firebase deploy --only firestore:rules
firebase deploy --only database
firebase deploy --only storageKako se ovo uspoređuje s Firebase-ovim ugrađenim alatima
Firebase konzola vam pokazuje trenutna pravila, ali ih ne auditira u odnosu na runtime ponašanje. Simulator Firebase pravila omogućuje testiranje logike pravila u odnosu na sintetičke zahtjeve — korisno, ali lokalno. Nijedan alat vam ne govori što vaša produkcijska pravila zapravo vraćaju anonimnom napadaču na javnom internetu. Vanjski skener poput FixVibe-a (ili Burp Suite uz ručnu konfiguraciju) jedina je stvar koja ispituje iz istog kuta iz kojeg bi napadač. Google-ov vlastiti App Check ublažava zlouporabu, ali ne zamjenjuje ispravno ograničena pravila.
Često postavljana pitanja
Hoće li skener čitati ili mijenjati moje Firestore podatke?
Pasivni skenovi izdaju najviše jedno anonimno čitanje po servisu da bi potvrdili dopuštaju li to pravila. Skener bilježi oblik odgovora i prisutnost podataka — ne paginira, ne nabraja dokumente i ne piše. Probe pisanja uvjetovane su verificiranim vlasništvom domene i nikada se ne pokreću prema neverificiranim ciljevima.
Što ako moj Firebase projekt koristi App Check?
App Check odbija neautenticirane zahtjeve s 403. Skener bez App Check tokena vidjet će 403 na svakoj probi — što je ispravan ishod. App Check nije zamjena za ispravnost pravila (ukraden App Check token plus otvoreno pravilo i dalje propušta podatke), ali blokira oportunističke vanjske skenove.
Može li skener detektirati djelomične pogrešne konfiguracije pravila (otvoreno čitanje, zatvoreno pisanje)?
Da — svako pravilo (allow read, allow write) ispituje se zasebno. Read-only proba koja uspije s 200 OK prijavljuje nalaz otvorenog čitanja čak i ako su pisanja zabranjena. Ova dva nalaza su različita: eksfiltracija podataka i manipulacija podataka su zasebni rizici.
Radi li ovo za Firebase aplikacije deploy-ane pod prilagođenom domenom?
Da. Skener izvlači Firebase project ID iz deploy-anog bundlea, a ne iz domene. Prilagođene domene, app.web.app poddomene i samohostane Firebase aplikacije sve rade na isti način dokle god je JavaScript bundle dostupan.
Sljedeći koraci
Pokrenite besplatan FixVibe sken prema svom produkcijskom URL-u — provjera baas.firebase-rules isporučuje se u svakom paketu i označava otvorena pravila u Firestoreu, Realtime Databaseu i Cloud Storageu. Za detaljnije objašnjenje obrasca allow read, write: if true specifično, pogledajte Firebase allow read, write: if true objašnjeno. Za pogled iz ptičje perspektive na Supabase, Firebase, Clerk i Auth0, pročitajte Skener BaaS pogrešnih konfiguracija.
