// docs / baas security / firebase rules scanner
Scanner di regole Firebase: trova regole aperte in Firestore, Realtime Database e Storage
Le app Firebase falliscono in sicurezza in un modo coerente: regole allow read, write: if true; rimaste dal quickstart in test-mode, mai sostituite prima della produzione. Gli strumenti di codifica IA generano queste regole letteralmente dagli esempi della documentazione e raramente sollecitano lo sviluppatore a indurirle. Questo articolo mostra come uno scanner di regole Firebase rileva regole aperte attraverso Firestore, Realtime Database e Cloud Storage da fuori del progetto — e come correggere ciò che trova.
Come lo scanner trova regole Firebase aperte
Firebase services are reachable at predictable public addresses, so a scanner with no credentials can check each one the way an anonymous visitor would. FixVibe's Firebase check covers all three services independently:
- Firestore. FixVibe finds the project from the deployed app's own Firebase configuration and reports collections that anonymous visitors can read.
- Realtime Database. FixVibe reports a database whose data anonymous visitors can read — often the whole tree at once.
- Cloud Storage. FixVibe reports buckets that anonymous visitors can list. Listable storage is a finding even when individual downloads are denied, because it lets attackers find guessable filenames.
Come appare davvero il footgun del test-mode
La documentazione di quickstart di Firebase include uno dei blocchi di regole più copiati di Internet:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
}
}
}Firebase aggiungeva una scadenza automatica di 30 giorni a queste regole. Questo è cambiato: oggi le regole persistono per sempre a meno che lo sviluppatore non le sostituisca. Gli strumenti di codifica IA — addestrati su anni di documentazione che include il blocco test-mode — lo emettono spesso letteralmente e dicono allo sviluppatore "questa è la tua regola di sicurezza". Non lo è.
Altre varianti che compaiono in produzione ma sono ugualmente permissive:
// 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;
- Una variante con timestamp futuro: una regola che permette tutto fino a una data lontana nel futuro. Non scade mai effettivamente (vedi il blocco evidenziato sopra).
allow read: if true; allow write: if request.auth != null;— letture pubbliche, qualsiasi utente autenticato può scrivere.allow read, write: if request.auth != null;— qualsiasi utente loggato può leggere o scrivere qualsiasi documento, inclusi dati di altri utenti.
Cosa fare quando lo scanner trova una regola aperta
Le regole aperte di Firebase sono un'emergenza in produzione. La correzione ha la stessa forma in tutti e tre i servizi: limita ogni regola a request.auth.uid contro un campo proprietario esplicito. Ogni servizio ha la sua sintassi di regole:
Firestore
match /users/{userId} { allow read, write: if request.auth != null && request.auth.uid == userId; }. Il binding del segmento di percorso {userId} diventa l'unico documento che l'utente può toccare.
match /users/{userId} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}Banca dati in tempo reale
{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }. Il wildcard $uid cattura il segmento di percorso per il confronto.
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}Archiviazione nel cloud
service firebase.storage { match /b/{bucket}/o { match /users/{userId}/{allPaths=**} { allow read, write: if request.auth.uid == userId; } } }. Convenzione: memorizza i file sotto users/[uid]/[filename] e lascia che il percorso imponga la proprietà.
service firebase.storage {
match /b/{bucket}/o {
match /users/{userId}/{allPaths=**} {
allow read, write: if request.auth.uid == userId;
}
}
}Deploy rules via the Firebase CLI: firebase deploy --only firestore:rules, firebase deploy --only database, firebase deploy --only storage. Verify the new rules are in production by re-running the FixVibe scan — the open-rules finding should clear.
firebase deploy --only firestore:rules
firebase deploy --only database
firebase deploy --only storageCome si confronta con gli strumenti integrati di Firebase
La Firebase Console ti mostra le regole correnti ma non le audita contro il comportamento runtime. Il simulatore di regole Firebase ti permette di testare la logica delle regole contro richieste sintetiche — utile ma locale. Nessuno dei due strumenti ti dice cosa le tue regole di produzione restituiscono effettivamente a un attaccante anonimo su Internet pubblico. Uno scanner esterno come FixVibe (o Burp Suite con configurazione manuale) è l'unica cosa che sonda dallo stesso angolo di un attaccante. L<em>App Check</em> di Google mitiga labuso ma non sostituisce regole correttamente limitate.
Domande frequenti
Lo scanner legge o modifica i miei dati Firestore?
Le scansioni passive emettono al massimo una lettura anonima per servizio per confermare se le regole la permettono. Lo scanner registra la forma della risposta e la presenza di dati — non pagina, non enumera documenti e non scrive. I sondaggi di scrittura sono soggetti a verifica della proprietà del dominio e non vengono mai eseguiti contro target non verificati.
Cosa succede se il mio progetto Firebase usa App Check?
App Check rifiuta le richieste non autenticate con un 403. Uno scanner senza token App Check vedrà 403 a ogni sondaggio — che è il risultato corretto. App Check non è un sostituto della correttezza delle regole (un token App Check rubato più una regola aperta fa ancora trapelare dati), ma blocca scansioni esterne opportunistiche.
Lo scanner può rilevare configurazioni parziali (lettura aperta, scrittura chiusa)?
Yes. Open read access and open write access are reported as separate findings, because data exfiltration and data manipulation are separate risks.
Funziona per app Firebase deployate sotto un dominio personalizzato?
Sì. Lo scanner estrae l'ID del progetto Firebase dal bundle deployato, non dal dominio. Domini personalizzati, sottodomini app.web.app e app Firebase self-hosted funzionano tutti allo stesso modo finché il bundle JavaScript è raggiungibile.
Prossimi passi
Run a free FixVibe scan against your production URL — the Firebase rules check runs on every plan and flags open rules across Firestore, Realtime Database, and Cloud Storage. For a deeper explainer on the allow read, write: if true pattern specifically, see Firebase allow read, write: if true explained. For the umbrella view across Supabase, Firebase, Clerk, and Auth0, read BaaS misconfiguration scanner.
