Correggi le regole insicure

Utilizza questa guida per comprendere le vulnerabilità comuni nelle configurazioni delle regole di sicurezza di Cloud Firestore, rivedere e proteggere meglio le tue regole e testare le modifiche prima di distribuirle.

Se ricevi un avviso che indica che il tuo database Cloud Firestore non è adeguatamente protetto, puoi risolvere le vulnerabilità modificando e testando le regole di sicurezza di Cloud Firestore.

Per visualizzare le regole di sicurezza esistenti, vai alla scheda Regole nella console Firebase.

Comprendi le regole di sicurezza di Cloud Firestore

Le regole di sicurezza di Cloud Firestore proteggono i tuoi dati da utenti malintenzionati. Le regole predefinite per qualsiasi istanza Cloud Firestore creata nella console Firebase negano l'accesso a tutti gli utenti. Per sviluppare la tua app e accedere al tuo database, dovrai modificare tali regole e potresti prendere in considerazione la concessione dell'accesso generale a tutti gli utenti in un ambiente di sviluppo. Prima di distribuire la tua app in un ambiente di produzione, tuttavia, prenditi il ​​tempo necessario per configurare correttamente le regole e proteggere i tuoi dati.

Mentre sviluppi la tua app e testi diverse configurazioni per le tue regole, utilizza l' emulatore Cloud Firestore per eseguire la tua app in un ambiente di sviluppo locale.

Scenari comuni con regole non sicure

Le regole di sicurezza di Cloud Firestore che potresti aver impostato per impostazione predefinita o quando hai lavorato inizialmente allo sviluppo della tua app con Cloud Firestore dovrebbero essere riviste e aggiornate prima di distribuire la tua app. Assicurati di proteggere adeguatamente i dati dei tuoi utenti evitando le seguenti trappole comuni.

Accesso libero

Durante la configurazione di Cloud Firestore, potresti aver impostato le regole per consentire l'accesso aperto durante lo sviluppo. Potresti pensare di essere l'unica persona a utilizzare la tua app, ma se l'hai distribuita, è disponibile su Internet. Se non autentichi gli utenti e non configuri le regole di sicurezza, chiunque indovini il tuo ID progetto può rubare, modificare o eliminare i dati.

Non consigliato: accesso in lettura e scrittura a tutti gli utenti.
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
Soluzione: regole che limitano l'accesso in lettura e scrittura.

Crea regole che abbiano senso per la tua gerarchia di dati. Una delle soluzioni comuni a questa insicurezza è la sicurezza basata sull'utente con l'autenticazione Firebase. Ulteriori informazioni sull'autenticazione degli utenti con le regole .

Solo proprietario dei contenuti

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      allow read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Accesso misto pubblico e privato

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Accesso per qualsiasi utente autenticato

A volte, le regole di sicurezza di Cloud Firestore verificano che un utente abbia effettuato l'accesso, ma non limitano ulteriormente l'accesso in base a tale autenticazione. Se una delle tue regole include auth != null , conferma che desideri che qualsiasi utente connesso abbia accesso ai dati.

Non consigliato: qualsiasi utente connesso ha accesso in lettura e scrittura all'intero database.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
Soluzione: accesso ristretto utilizzando condizioni di sicurezza.

Quando controlli l'autenticazione, potresti anche voler utilizzare una delle proprietà di autenticazione per limitare ulteriormente l'accesso a utenti specifici per set di dati specifici. Ulteriori informazioni sull'aggiunta di condizioni di sicurezza e sull'accesso basato sui ruoli .

Accesso basato sui ruoli

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

Accesso basato sugli attributi

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

Accesso misto pubblico e privato

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Accesso chiuso

Mentre sviluppi la tua app, un altro approccio comune è mantenere i tuoi dati protetti. In genere, ciò significa che hai chiuso l'accesso in lettura e scrittura a tutti gli utenti, come segue:

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Gli SDK di amministrazione di Firebase e Cloud Functions possono comunque accedere al tuo database. Utilizza queste regole quando intendi utilizzare Cloud Firestore come backend solo server insieme a Firebase Admin SDK. Sebbene sia sicuro, dovresti verificare che i client della tua app possano recuperare correttamente i dati.

Scopri di più sulle regole di sicurezza di Cloud Firestore e su come funzionano in Introduzione alle regole di sicurezza di Cloud Firestore .

Controlla le regole di sicurezza di Cloud Firestore

Per controllare il comportamento della tua app e verificare le configurazioni delle regole di sicurezza Cloud Firestore, utilizza l' emulatore Cloud Firestore . Utilizza l'emulatore Cloud Firestore per eseguire e automatizzare gli unit test in un ambiente locale prima di distribuire eventuali modifiche.

Per testare rapidamente le regole di sicurezza Cloud Firestore aggiornate nella console Firebase, utilizza lo strumento Rules Playground.

  1. Per aprire il Parco giochi delle regole, fai clic su Parco giochi delle regole dalla scheda Regole .
  2. Nelle impostazioni del parco giochi Regole , seleziona le opzioni per il tuo test, tra cui:
    • Test di lettura o scrittura
    • Una posizione specifica nel database, come percorso
    • Tipo di autenticazione: utente anonimo non autenticato, autenticato o un ID utente specifico
    • Dati specifici del documento a cui le tue regole fanno riferimento specificamente (ad esempio, se le tue regole richiedono la presenza di un campo specifico prima di consentire una scrittura)
  3. Fai clic su Esegui e cerca i risultati nel banner sopra la finestra delle regole.