// docs / baas security / firebase rules scanner
Skener pravil Firebase: poiščite odprta pravila Firestore, Realtime Database in Storage
Aplikacije Firebase varnostno odpovedo na en sam dosleden način: pravila <code>allow read, write: if true;</code>, ostala iz hitre namestitve test-načina, nikoli zamenjana pred produkcijo. UI-orodja za kodiranje ta pravila generirajo dobesedno iz primerov dokumentacije in razvijalca redko pozovejo, naj jih utrdi. Ta članek prikazuje, kako skener pravil Firebase od zunaj zazna odprta pravila v Firestore, Realtime Database in Cloud Storage — in kako popraviti, kar najde.
Kako skener najde odprta pravila Firebase
Storitve Firebase izpostavljajo dobro znane, predvidljive oblike URL-jev. Skener brez poverilnic lahko vsako sondira in opazuje, ali anonimna branja uspejo. FixVibov pregled baas.firebase-rules teče v treh neodvisnih sondah — eni na storitev Firebase:
- <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 sondira
https://[project-id]-default-rtdb.firebaseio.com/.json. Če je koren anonimno berljiv, je odziv celotno drevo baze v obliki JSON. Bolj konservativen test poizveduje.json?shallow=true, ki vrne samo ključe na najvišji ravni — najdba v obeh primerih. - Cloud Storage. Skener poizveduje
https://firebasestorage.googleapis.com/v0/b/[project-id].appspot.com/o. Če odziv brez avtentikacije izpiše imena datotek, je vedro anon-naštevno. Naštevno shrambo je najdba tudi takrat, ko so posamezni prenosi datotek zavrnjeni — napadalci vedro preštejejo, da najdejo ugibljiva imena.
Kako pravzaprav izgleda past test-načina
Hitra namestitev Firebase v dokumentaciji vključuje enega najbolj prilepljenih blokov pravil na internetu:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}Firebase je nekoč tem pravilom dodajal samodejen 30-dnevni rok veljavnosti. To se je spremenilo: danes pravila trajajo večno, razen če jih razvijalec zamenja. UI-orodja za kodiranje — naučena na letih dokumentacije, ki vključuje blok test-načina — ga pogosto dobesedno izdajo in razvijalcu povedo „to je vaše varnostno pravilo". Ni.
Druge različice, ki se pojavljajo v produkciji, a so enako popustljive:
// 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;
- Različica s časovnim žigom v prihodnosti: pravilo, ki vse dovoli do datuma daleč v prihodnosti. Nikoli učinkovito ne poteče (glejte označeni blok zgoraj).
allow read: if true; allow write: if request.auth != null;— javna branja, vsak avtenticirani uporabnik lahko piše.allow read, write: if request.auth != null;— vsak prijavljen uporabnik lahko bere ali piše vsak dokument, vključno s podatki drugih uporabnikov.
Kaj storiti, ko skener najde odprto pravilo
Odprta pravila Firebase so izvajalna nuja. Popravek ima isto obliko v vseh treh storitvah: vsako pravilo omejite na request.auth.uid proti izrecnemu polju lastnika. Vsaka storitev ima svojo sintakso pravil:
Firestore
match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. Vezava odseka poti {userId} postane edini dokument, ki se ga uporabnik lahko dotakne.
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: datoteke shranjujte pod users/[uid]/[filename] in naj pot uveljavlja lastništvo.
service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/{allPaths=**} {
allow read, write: if request.auth.uid == userId;
}
}
}Pravila izdajte prek Firebase CLI: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Preverite, da so nova pravila v produkciji, tako da znova zaženete FixVibe-pregled — najdba baas.firebase-rules bi morala izginiti.
firebase deploy --only firestore:rules
firebase deploy --only database
firebase deploy --only storageKako se to primerja z vgrajenimi orodji Firebase
Konzola Firebase vam pokaže trenutna pravila, vendar jih ne preverja glede izvajalnega vedenja. Simulator pravil Firebase vam omogoča testiranje logike pravil proti sintetičnim zahtevam — uporabno, vendar lokalno. Nobeno od orodij vam ne pove, kaj vaša produkcijska pravila dejansko vrnejo anonimnemu napadalcu na javnem internetu. Zunanji skener, kot je FixVibe (ali Burp Suite z ročno konfiguracijo), je edino, kar sondira iz istega kota kot napadalec. Googlov App Check blaži zlorabe, vendar ne nadomešča pravilno omejenih pravil.
Pogosto zastavljena vprašanja
Ali skener bere ali spreminja moje podatke v Firestore?
Pasivna skeniranja izdajo največ eno anonimno branje na storitev, da potrdijo, ali pravila to dovolijo. Skener zabeleži obliko odziva in prisotnost podatkov — ne stranično, ne našteva dokumentov in ne piše. Pisalne sonde so omejene s preverjenim lastništvom domene in nikoli ne tečejo proti neverificiranim ciljem.
Kaj če moj Firebase-projekt uporablja App Check?
App Check zavrne neavtenticirane zahteve z 403. Skener brez žetona App Check bo pri vsaki sondi videl 403 — kar je pravilen izid. App Check ni nadomestilo za pravilnost pravil (ukraden žeton App Check plus odprto pravilo še vedno odteka podatke), vendar blokira oportunistične zunanje preglede.
Ali lahko skener zazna delne napačne konfiguracije pravil (branje odprto, pisanje zaprto)?
Da — vsako pravilo (allow read, allow write) se sondira ločeno. Sonda samo za branje, ki uspe z 200 OK, sporoči najdbo odprtega branja, tudi če so pisanja zavrnjena. Najdbi sta različni: odtekanje podatkov in manipulacija podatkov sta ločeni tveganji.
Ali to deluje za Firebase-aplikacije, izdane pod lastno domeno?
Da. Skener iz izdanega snopa izvleče ID Firebase-projekta, ne iz domene. Lastne domene, poddomene app.web.app in samostojno gostovane Firebase-aplikacije delujejo enako, dokler je JavaScript-snop dosegljiv.
Naslednji koraki
Zaženite brezplačen FixVibe-pregled proti svojemu produkcijskemu URL-ju — pregled baas.firebase-rules je v vsakem paketu in označi odprta pravila v Firestore, Realtime Database in Cloud Storage. Za poglobljeno razlago vzorca allow read, write: if true glejte Firebase allow read, write: if true razloženo. Za krovni pregled po Supabase, Firebase, Clerk in Auth0 preberite Skener napačnih konfiguracij BaaS.
