Correggi le regole non sicure

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

Se ricevi un avviso che ti informa che il tuo database Firestore non è protetto correttamente, puoi risolvere le vulnerabilità modificando e testando Regole di sicurezza di Firestore.

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

Comprendi le regole di sicurezza di Firestore

Le regole di sicurezza di Firestore proteggono i tuoi dati da utenti malintenzionati. Le regole predefinite per qualsiasi istanza Firestore creata nella Console Firebase negano l'accesso a tutti gli utenti. Per sviluppare la tua app e accedere al tuo database, dovrai modificare queste regole e potresti valutare la concessione dell'accesso generale a tutti gli utenti di un ambiente di sviluppo. Tuttavia, prima di eseguire il deployment dell'app in un ambiente di produzione, prenditi il tempo di configurare correttamente le regole e proteggere i dati.

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

Scenari comuni con regole non sicure

Le regole di sicurezza di Firestore che potresti aver impostato per impostazione predefinita o come inizialmente hanno lavorato allo sviluppo della tua app con Firestore, dovrebbero essere esaminati e aggiornati prima di eseguire il deployment dell'app. Assicurati di proteggere adeguatamente i tuoi utenti dati evitando i seguenti inconvenienti comuni.

Accesso libero

Durante la configurazione di Firestore, potresti aver impostato le regole per consentire l'accesso libero durante lo sviluppo. Potresti pensare di essere l'unica persona che utilizza ma se ne hai eseguito il deployment, è disponibile su internet. Se non autentichi gli utenti e non configuri 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 pertinenti per la tua gerarchia di dati. Una delle soluzioni comuni a questo problema di sicurezza è la sicurezza basata sugli utenti con Firebase Authentication. Scopri di più 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 reads and deletion if the current user owns the existing document
      allow read, delete: if request.auth.uid == resource.data.author_uid;
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == 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 public reads
      allow read: if true
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;
      // Allow deletion if the current user owns the existing document
      allow delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}
  

Accesso per qualsiasi utente autenticato

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

Non consigliato: qualsiasi utente che ha eseguito l'accesso 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: restringi l'accesso utilizzando la sicurezza le condizioni di traffico.

Quando controlli l'autenticazione, ti consigliamo di utilizzare anche una delle proprietà di autenticazione per limitare ulteriormente l'accesso a utenti specifici per set di dati specifici. Scopri di più su come aggiungere 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 su 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

Durante lo sviluppo dell'app, un altro approccio comune è mantenere bloccati. In genere, significa che hai chiuso la lettura e la 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 Firebase Admin e Cloud Functions possono ancora accedere al tuo per configurare un database. Utilizza queste regole quando intendi utilizzare Firestore come server in combinazione con Firebase SDK Admin. Sebbene sia sicura, dovresti verificare che i client della tua app possano recuperare correttamente i dati.

Scopri di più sulle regole di sicurezza Firestore e sul loro funzionamento in Introduzione alle regole di sicurezza Firestore.

Controlla le regole di sicurezza di Firestore

Per controllare il comportamento dell'app e verificare le configurazioni delle regole di sicurezza di Firestore, utilizza l'emulatore Firestore. Utilizza l'emulatore Firestore per eseguire e automatizzare i test di unità in un ambiente locale prima di implementare eventuali modifiche.

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

  1. Per aprire il playground delle regole, fai clic su Playground regole nella scheda Regole.
  2. Nelle impostazioni di Rules playground (Playground delle regole), seleziona le opzioni per il test, tra cui:
    • Test di letture o scritture
    • Una località specifica nel database, come percorso
    • Tipo di autenticazione: utente anonimo non autenticato, utente anonimo autenticato o un ID utente specifico
    • I dati specifici dei documenti a cui le regole fanno riferimento in modo specifico (ad Ad esempio, se le regole richiedono la presenza di un campo specifico prima consentendo una scrittura)
  3. Fai clic su Esegui e cerca i risultati nel banner sopra la finestra delle regole.