Comprendi le regole di sicurezza di Firebase Realtime Database

Le regole di sicurezza di Firebase Realtime Database determinano chi ha accesso in lettura e scrittura al database, come sono strutturati i dati e quali indici esistono. Queste regole sono attive sui server Firebase e vengono applicate automaticamente in qualsiasi momento. Ogni richiesta di lettura e scrittura verrà completata solo se le tue regole lo consentono. Per impostazione predefinita, le tue regole non consentano a nessuno di accedere al tuo database. In questo modo, proteggiamo da abusi finché non avrai il tempo di personalizzare le regole o configurare autenticazione.

Le regole di sicurezza di Realtime Database hanno una sintassi simile a JavaScript e sono disponibili in quattro tipi:

Tipi di regole
.read Descrive se e quando gli utenti possono leggere i dati.
.write Descrive se e quando è consentito scrivere i dati.
.validate Definisce l'aspetto di un valore formattato correttamente, se ha attributi figlio e il tipo di dati.
.indexOn Specifica un asset figlio da indicizzare per supportare l'ordinamento e l'esecuzione di query.

Panoramica sulla sicurezza di Realtime Database

Firebase Realtime Database fornisce un set completo di strumenti per gestire la sicurezza della tua app. Questi strumenti semplificano l'autenticazione degli utenti, l'applicazione delle autorizzazioni utente e la convalida degli input.

Le app basate su Firebase eseguono più codice lato client rispetto a quelle con molti altri stack tecnologici. Pertanto, il nostro approccio alla sicurezza potrebbe essere diversi da quelli a cui sei abituato.

Autenticazione

Un primo passaggio comune per proteggere la tua app è identificare gli utenti. Questo processo è chiamato autenticazione. Puoi utilizzare Firebase Authentication per consentire agli utenti di accedere alla tua app. Firebase Authentication include il supporto immediato per i metodi di autenticazione comuni come Google e Facebook, nonché l'accesso con email e password, l'accesso anonimo e altro ancora.

L'identità utente è un concetto di sicurezza importante. Ogni utente ha e a volte hanno capacità diverse. Ad esempio, in una chat dell'applicazione, ogni messaggio viene associato all'utente che lo ha creato. Gli utenti potrebbero anche essere in grado di eliminare i propri messaggi, ma non quelli pubblicati da altri utenti.

Autorizzazione

L'identificazione dell'utente è solo una parte della sicurezza. Una volta che sai chi sono, hai bisogno di un modo per controllare il loro accesso ai dati nel tuo database. Regole di sicurezza di Realtime Database ti consentono di controllare l'accesso per ogni utente. Ad esempio, di seguito è riportato un insieme regole di sicurezza che consentono a chiunque di leggere il percorso /foo/, ma non una per scriverci:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Le regole .read e .write vengono applicate a cascata, quindi questo insieme di regole Concede l'accesso in lettura a tutti i dati nel percorso /foo/, nonché a eventuali dati come /foo/bar/baz. Tieni presente che .read e .write regole più profonde nel database hanno la precedenza su regole più profonde, quindi in questo esempio verrà comunque concesso l'accesso in lettura a /foo/bar/baz anche se una regola nel percorso /foo/bar/baz è stata valutata come false.

Le regole di sicurezza di Database in tempo reale includono variabili predefinite e funzioni che ti consentono di fare riferimento ad altri percorsi, timestamp lato server, informazioni di autenticazione e altro ancora. Ecco un esempio di regola che concede l'accesso in scrittura utenti autenticati in /users/<uid>/, dove <uid> sono L'ID dell'utente ottenuto tramite Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Convalida dei dati

Firebase Realtime Database è senza schema. In questo modo è facile apportare modifiche durante lo sviluppo, ma una volta che l'app è pronta per la distribuzione, è importante che i dati rimangano coerenti. Il linguaggio delle regole include un .validate che consente di applicare la logica di convalida utilizzando le stesse espressioni utilizzate per le regole .read e .write. L'unica differenza è che le regole di convalida non vengono applicate a cascata, pertanto tutte le le regole di convalida devono restituire un valore true per consentire la scrittura.

Queste regole applicano che i dati scritti in /foo/ devono essere una stringa meno di 100 caratteri:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Le regole di convalida hanno accesso a tutte le funzioni e alle variabili predefinite delle regole .read e .write. Puoi utilizzarli per creare regole di convalida che tengano conto dei dati in altre parti del database, dell'identità dell'utente, dell'ora del server e molto altro ancora.

Definizione degli indici di database

Firebase Realtime Database consente di ordinare i dati ed eseguire query. Per piccole dimensioni dei dati, il database supporta le query ad hoc, pertanto gli indici in genere non sono richiesti durante lo sviluppo. Prima di lanciare l'app, però, è importante per specificare gli indici per le query, in modo che continuino a funzionare la tua app possa crescere.

Gli indici vengono specificati utilizzando la regola .indexOn. Ecco un esempio di dichiarazione di indice che indicizzerebbe i campi altezza e lunghezza per un elenco di dinosauri:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Passaggi successivi