Comprendere le regole di sicurezza del database Firebase Realtime

Le regole di sicurezza del database Firebase Realtime determinano chi ha accesso in lettura e scrittura al tuo database, come sono strutturati i tuoi dati e quali indici esistono. Queste regole risiedono sui server Firebase e vengono applicate automaticamente in ogni momento. Ogni richiesta di lettura e scrittura verrà completata solo se le tue regole lo consentono. Per impostazione predefinita, le tue regole non consentono a nessuno di accedere al tuo database. Questo serve a proteggere il tuo database dagli abusi finché non avrai il tempo di personalizzare le tue regole o impostare l'autenticazione.

Le regole di sicurezza del database in tempo reale hanno una sintassi simile a JavaScript e sono disponibili in quattro tipi:

Tipi di regole
.Leggere Descrive se e quando i dati possono essere letti dagli utenti.
.scrivere Descrive se e quando è consentita la scrittura dei dati.
.convalidare Definisce l'aspetto di un valore formattato correttamente, se ha attributi secondari e il tipo di dati.
.indexOn Specifica un elemento figlio da indicizzare per supportare l'ordinamento e l'esecuzione di query.

Panoramica sulla sicurezza del database in tempo reale

Il Firebase Realtime Database fornisce un set completo di strumenti per la gestione della sicurezza della tua app. Questi strumenti semplificano l'autenticazione degli utenti, l'applicazione delle autorizzazioni degli utenti 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 modo in cui affrontiamo la sicurezza potrebbe essere leggermente diverso da quello a cui sei abituato.

Autenticazione

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

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

Autorizzazione

Identificare il tuo 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. Le regole di sicurezza del database in tempo reale consentono di controllare l'accesso per ciascun utente. Ad esempio, ecco un insieme di regole di sicurezza che consentono a chiunque di leggere il percorso /foo/ , ma a nessuno di scrivervi:

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

Le regole .read e .write sono a cascata, quindi questo set di regole garantisce l'accesso in lettura a qualsiasi dato nel percorso /foo/ così come a qualsiasi percorso più profondo come /foo/bar/baz . Tieni presente che le regole .read e .write meno profonde nel database sovrascrivono le regole più profonde, quindi l'accesso in lettura a /foo/bar/baz verrebbe comunque concesso in questo esempio anche se una regola nel percorso /foo/bar/baz viene valutata come false.

Le regole di sicurezza del database in tempo reale includono variabili e funzioni integrate che 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 per gli utenti autenticati a /users/<uid>/ , dove <uid> è l'ID dell'utente ottenuto tramite Firebase Authentication.

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

Convalida dei dati

Il database Firebase Realtime è senza schema. Ciò semplifica la modifica delle cose durante lo sviluppo, ma una volta che l'app è pronta per la distribuzione, è importante che i dati rimangano coerenti. Il linguaggio delle regole include una regola .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 validazione non si applicano a cascata , quindi tutte le regole di validazione rilevanti devono essere valutate come true affinché la scrittura sia consentita.

Queste regole impongono che i dati scritti in /foo/ debbano essere una stringa inferiore a 100 caratteri:

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

Le regole di convalida hanno accesso a tutte le stesse funzioni e variabili integrate delle regole .read e .write . Puoi utilizzarli per creare regole di convalida che tengano conto dei dati altrove nel tuo database, dell'identità dell'utente, dell'ora del server e molto altro.

Definizione degli indici dei database

Il Firebase Realtime Database consente di ordinare ed eseguire query sui dati. Per dati di piccole dimensioni, il database supporta query ad hoc, pertanto gli indici generalmente non sono richiesti durante lo sviluppo. Prima di lanciare la tua app, tuttavia, è importante specificare gli indici per tutte le query necessarie per assicurarti che continuino a funzionare man mano che la tua app cresce.

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"]
    }
  }
}

Prossimi passi