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 vengono applicate automaticamente in qualsiasi momento sui server Firebase. 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 database da abusi finché non hai il tempo di personalizzare le regole o configurare l'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 è consentita la scrittura dei dati. |
.validate | Definisce l'aspetto di un valore con formattazione corretta, se ha attributi secondari e il tipo di dati. |
.indexOn | Specifica un elemento secondario da indicizzare per supportare l'ordinamento e le query. |
Realtime Database panoramica della sicurezza
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 un po' diverso da quello a cui sei abituato.
Autenticazione
Un primo passaggio comune per proteggere la tua app è identificare gli utenti. Questa procedura è chiamata autenticazione. Puoi utilizzare Firebase Authentication 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é l'accesso con email e password, l'accesso anonimo e altro ancora.
L'identità utente è un concetto di sicurezza importante. Utenti diversi hanno dati diversi e, a volte, funzionalità 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 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. Le regole di sicurezza di Realtime Database
ti consentono di controllare l'accesso per ogni utente. Ad esempio, di seguito è riportato un insieme di
regole di sicurezza che consente a chiunque di leggere il percorso /foo/
, ma a nessuno di scrivere al suo interno:
{ "rules": { "foo": { ".read": true, ".write": false } } }
Le regole .read
e .write
sono a cascata, pertanto questo set di regole
concedi l'accesso in lettura a tutti i dati nel percorso /foo/
e a tutti i percorsi
più approfonditi, come /foo/bar/baz
. Tieni presente che le regole .read
e
.write
meno profonde nel database sostituiscono le regole più profonde, pertanto
l'accesso in lettura a /foo/bar/baz
verrebbe comunque concesso in questo esempio
anche se una regola nel percorso /foo/bar/baz
è stata valutata come falsa.
Le regole di sicurezza del 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 agli utenti autenticati l'accesso in scrittura a /users/<uid>/
, dove <uid> è 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 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 convalida non si applicano in modo ricorsivo, pertanto tutte le regole di convalida pertinenti devono restituire il valore true affinché la scrittura sia consentita.
Queste regole richiedono che i dati scritti in /foo/
debbano essere una stringa con 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 del 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. Tuttavia, prima di lanciare l'app, è importante specificare gli indici per le query in modo che continuino a funzionare man mano che l'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"] } } }
Passaggi successivi
- Inizia a pianificare lo sviluppo delle regole per il tuo database.
- Scopri di più su come proteggere i tuoi dati utilizzando le regole di sicurezza.
- Scopri di più su come specificare gli indici utilizzando le regole.