Sep 4, 2025
Firestore, il database NoSQL flessibile e scalabile di Google Firebase, è un componente fondamentale per molte applicazioni web e mobile. La sua capacità di sincronizzare i dati in tempo reale e di gestire grandi volumi di informazioni lo rende estremamente potente. Tuttavia, con la potenza arriva la responsabilità: proteggere i dati memorizzati su Firestore è di primaria importanza per la sicurezza e l'integrità della tua applicazione e dei tuoi utenti.
A differenza di un database tradizionale in cui la logica di accesso è gestita da un backend server, con Firestore gran parte del controllo degli accessi avviene direttamente sul lato client, ma è regolato da Firestore Security Rules. Questo approccio richiede una profonda comprensione di come queste regole funzionano per evitare vulnerabilità critiche.
Le Firestore Security Rules sono il meccanismo principale per proteggere i tuoi dati. Sono un set di espressioni scritte in una sintassi simile a JavaScript che determinano chi può leggere, scrivere, aggiornare o eliminare i dati nel tuo database.
Principi Fondamentali:
request.auth
), l'ora corrente (request.time
) e i dati che stanno per essere scritti (request.resource.data
o resource.data
per i dati esistenti).Esempio di Regole di Base:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Regola generica: nessun accesso a meno che non sia specificato diversamente
match /{document=**} {
allow read, write: if false;
}
// Esempio: Gli utenti autenticati possono leggere qualsiasi dato, ma non scrivere
match /users/{userId} {
allow read: if request.auth != null; // Solo gli utenti loggati possono leggere
allow create: if request.auth != null && request.auth.uid == userId; // Ogni utente può creare solo il proprio documento
allow update, delete: if request.auth != null && request.auth.uid == userId; // Solo il proprietario può aggiornare/eliminare
}
// Esempio: Una collezione 'posts' dove tutti possono leggere, ma solo gli autenticati possono scrivere
match /posts/{postId} {
allow read: if true; // Tutti possono leggere
allow write: if request.auth != null; // Solo gli utenti autenticati possono scrivere
}
// Esempio: I commenti sono visibili solo se il post è pubblicato e l'utente è autenticato
match /posts/{postId}/comments/{commentId} {
allow read: if get(/databases/$(database)/documents/posts/$(postId)).data.status == 'published' && request.auth != null;
allow write: if request.auth != null;
}
}
}
Scrivere regole di sicurezza robuste richiede attenzione ai dettagli e una mentalità difensiva.
Non Affidarti a allow read, write: if true;
: Questa regola è estremamente pericolosa e rende il tuo database completamente pubblico. Usala solo per scopi di test temporanei e mai in produzione.
Autenticazione Richiesta: Per la maggior parte delle applicazioni, quasi tutte le operazioni di scrittura dovrebbero richiedere che l'utente sia autenticato (request.auth != null
).
Validazione dei Dati in Scrittura: Controlla la forma e il contenuto dei dati in arrivo. Ad esempio, assicurati che un campo email
sia un'email valida, che un campo price
sia un numero positivo.
// Esempio di validazione in scrittura
match /products/{productId} {
allow create: if request.auth != null &&
request.resource.data.name is string &&
request.resource.data.name.size() > 0 &&
request.resource.data.price is float &&
request.resource.data.price > 0;
}
Ruoli e Permessi: Implementa un sistema di ruoli (es. admin
, editor
, viewer
) e basa le regole su di essi. Memorizza i ruoli nel documento utente di Firestore.
// Regola per utenti admin
function isAdmin() {
return request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'admin';
}
match /adminData/{docId} {
allow read, write: if isAdmin();
}
"Proprietario" del Documento: Per i dati specifici dell'utente (es. profilo, carrello), assicurati che solo l'utente proprietario possa leggerli o modificarli.
match /userProfiles/{userId} {
allow read, update, delete: if request.auth != null && request.auth.uid == userId;
allow create: if request.auth != null && request.auth.uid == userId;
}
Limitare il Numero di Letture/Scritture: Previeni attacchi denial-of-service o abusi limitando il numero di documenti che possono essere letti o scritti in una singola richiesta.
match /bigCollection/{docId} {
// Permette di leggere solo un massimo di 10 documenti alla volta
allow read: if request.resource.size() <= 10;
}
Testa le Regole: Utilizza il simulatore di regole di Firestore nella console Firebase per testare le tue regole contro vari scenari (utente autenticato/non autenticato, tipi di dati, percorsi diversi) prima di pubblicarle. È uno strumento indispensabile.
Sebbene le Security Rules siano la prima linea di difesa, una strategia di sicurezza completa per Firestore include anche altri elementi:
Per operazioni critiche o logica di business complessa, affidarsi solo alle regole di sicurezza lato client potrebbe non essere sufficiente. Le Cloud Functions for Firebase ti permettono di eseguire codice backend in un ambiente serverless, che è intrinsecamente più sicuro perché non esposto direttamente al client.
Anche se le regole di sicurezza e le funzioni cloud si occupano della validazione a livello di database, è sempre una buona pratica validare l'input sul lato client (nel tuo codice JavaScript).
Progetta il tuo database in modo che le informazioni sensibili non siano esposte più del necessario.
Proteggere i dati su Firestore è un aspetto cruciale dello sviluppo di applicazioni sicure e affidabili. Le Firestore Security Rules sono la tua prima e più importante linea di difesa, permettendoti di definire con precisione chi può fare cosa con i tuoi dati. Tuttavia, una strategia di sicurezza completa va oltre le semplici regole, includendo la validazione server-side tramite Cloud Functions, la validazione dell'input sul lato client e un'attenta progettazione del database per limitare l'esposizione dei dati sensibili.
Investi tempo nella comprensione e nel test delle tue regole di sicurezza. Un approccio proattivo alla sicurezza fin dall'inizio ti risparmierà molti problemi in futuro.
Scopri altri articoli dove approfondiamo le ultime tendenze, innovazioni e best practice che stanno plasmando il panorama digitale.