Cloud Storage for Firebase fornisce un modello di sicurezza basato su percorsi dichiarativi chiamata Firebase Security Rules per Cloud Storage, che ti consente di eseguire in modo facile e veloce proteggere i tuoi file.
Informazioni sulle regole
Firebase Security Rules di Cloud Storage viene utilizzato per determinare chi ha operazioni di lettura e scrittura
l'accesso ai file archiviati in Cloud Storage, nonché il modo in cui i file vengono
strutturati e i metadati che contengono. Il tipo di regola di base è allow
che consente le richieste read
e write
se specificato facoltativamente
, ad esempio:
// If no condition is specified, the rule evaluates to true allow read; // Rules can optionally specify a condition allow write: if <condition>; // Rules can also specify multiple request methods allow read, write: if <condition>;
Percorsi corrispondenti
Cloud Storage Security Rules match
i percorsi file utilizzati per accedere ai file in
Cloud Storage. Le regole possono match
includere percorsi esatti o con caratteri jolly e possono anche essere nidificate. Se nessuna regola di corrispondenza consente un metodo di richiesta, oppure
la condizione restituisce false
e la richiesta viene rifiutata.
Corrispondenze esatte
// Exact match for "images/profilePhoto.png" match /images/profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /images/croppedProfilePhoto.png { allow write: if <other_condition>; }
Corrispondenze nidificate
// Partial match for files that start with "images" match /images { // Exact match for "images/profilePhoto.png" match /profilePhoto.png { allow write: if <condition>; } // Exact match for "images/croppedProfilePhoto.png" match /croppedProfilePhoto.png { allow write: if <other_condition>; } }
Corrispondenze con caratteri jolly
Le regole possono essere utilizzate anche per match
un pattern utilizzando i caratteri jolly. Un carattere jolly è un
variabile con nome che rappresenta una singola stringa come
profilePhoto.png
o più segmenti del percorso, come
images/profilePhoto.png
.
Un carattere jolly viene creato aggiungendo parentesi graffe intorno al nome, come
{string}
. È possibile dichiarare un carattere jolly per più segmenti aggiungendo =**
al
nome con caratteri jolly, ad esempio {path=**}
:
// Partial match for files that start with "images" match /images { // Exact match for "images/*" // e.g. images/profilePhoto.png is matched match /{imageId} { // This rule only matches a single path segment (*) // imageId is a string that contains the specific segment matched allow read: if <condition>; } // Exact match for "images/**" // e.g. images/users/user:12345/profilePhoto.png is matched // images/profilePhoto.png is also matched! match /{allImages=**} { // This rule matches one or more path segments (**) // allImages is a path that contains all segments matched allow read: if <other_condition>; } }
Se più regole corrispondono a un file, il risultato è il OR
del risultato di tutte
e valutazioni di regole. In altre parole, se una regola che corrisponde al file restituisce true
, il risultato è true
.
Nelle regole precedenti, il file "images/profilePhoto.png" può essere letto se
condition
o other_condition
restituiscono true, mentre il file
"images/users/user:12345/profilePhoto.png" è soggetto solo al risultato
other_condition
.
È possibile fare riferimento a una variabile con caratteri jolly dall'interno del file fornito da match
autorizzazione del percorso o del nome:
// Another way to restrict the name of a file match /images/{imageId} { allow read: if imageId == "profilePhoto.png"; }
Cloud Storage Security Rules non vengono applicati a cascata e le regole vengono valutate solo quando il percorso della richiesta corrisponde a un percorso con le regole specificate.
Richiedi valutazione
I caricamenti, i download, le modifiche e le eliminazioni dei metadati vengono valutati utilizzando il
request
inviato a Cloud Storage. La variabile request
contiene il parametro
il percorso del file in cui viene eseguita la richiesta, l'ora in cui
ricevuto e il nuovo valore resource
se la richiesta è una scrittura. Intestazioni HTTP
e lo stato dell'autenticazione.
L'oggetto request
contiene anche l'ID univoco dell'utente e
Payload Firebase Authentication nell'oggetto request.auth
, che verrà
spiegata in modo più approfondito nella sezione Sicurezza basata sull'utente
sezione dei documenti.
Di seguito è disponibile un elenco completo delle proprietà nell'oggetto request
:
Proprietà | Tipo | Descrizione |
---|---|---|
auth |
mappa<stringa, stringa> | Quando un utente accede, fornisce uid , l'ID univoco dell'utente e
token , una mappa di Firebase Authentication dichiarazioni JWT. In caso contrario,
null . |
params |
mappa<stringa, stringa> | Mappa contenente i parametri di query della richiesta. |
path |
percorso | Un path che rappresenta il percorso in cui viene eseguita la richiesta. |
resource |
map<string, string> | Il nuovo valore della risorsa, presente solo nelle richieste write .
|
time |
timestamp | Un timestamp che rappresenta l'ora del server in cui viene valutata la richiesta. |
Valutazione delle risorse
Durante la valutazione delle regole, è consigliabile esaminare anche i metadati del file in fase di caricamento, download, modifica o eliminazione. Questo consente di creare regole complesse ed efficaci, ad esempio consentire solo i file con tipi di contenuti da caricare o solo i file di dimensioni superiori a una determinata dimensione eliminati.
Firebase Security Rules per Cloud Storage fornisce i metadati del file nell'oggetto resource
, che contiene coppie chiave/valore dei metadati visualizzati in un oggetto Cloud Storage. Queste proprietà possono essere ispezionate su read
o
Richieste di write
per garantire l'integrità dei dati.
Per le richieste di write
(come caricamenti, aggiornamenti ed eliminazioni di metadati), in
aggiunta all'oggetto resource
, che contiene i metadati del file
attualmente esistente nel percorso di richiesta, puoi anche utilizzare
request.resource
, che contiene un sottoinsieme dei metadati del file da utilizzare
se la scrittura è consentita. Puoi utilizzare questi due valori per garantire l'integrità dei dati o applicare vincoli di applicazione come il tipo o le dimensioni del file.
Di seguito è disponibile un elenco completo delle proprietà nell'oggetto resource
:
Proprietà | Tipo | Descrizione |
---|---|---|
name |
stringa | Il nome completo dell'oggetto |
bucket |
stringa | Il nome del bucket in cui si trova l'oggetto. |
generation |
int | In GCS generazione di quest'oggetto. |
metageneration |
int | In GCS metagenerazione di questo oggetto. |
size |
int | Le dimensioni dell'oggetto in byte. |
timeCreated |
timestamp | Un timestamp che rappresenta l'ora in cui è stato creato un oggetto. |
updated |
timestamp | Un timestamp che rappresenta l'ora dell'ultimo aggiornamento di un oggetto. |
md5Hash |
stringa | Un hash MD5 dell'oggetto. |
crc32c |
stringa | Un hash crc32c dell'oggetto. |
etag |
stringa | L'etag associato a questo oggetto. |
contentDisposition |
stringa | La disposizione dei contenuti associata a questo oggetto. |
contentEncoding |
stringa | La codifica dei contenuti associata a questo oggetto. |
contentLanguage |
stringa | La lingua dei contenuti associata a questo oggetto. |
contentType |
stringa | Il tipo di contenuti associato all'oggetto. |
metadata |
mappa<stringa, stringa> | Coppie chiave/valore di metadati personalizzati aggiuntivi specificati dallo sviluppatore. |
request.resource
contiene tutti questi valori tranne generation
,
metageneration
, etag
, timeCreated
e updated
.
Esempio completo
Mettendo tutto insieme, puoi creare un esempio completo di regole per una soluzione di archiviazione delle immagini:
service firebase.storage { match /b/{bucket}/o { match /images { // Cascade read to any image type at any path match /{allImages=**} { allow read; } // Allow write files to the path "images/*", subject to the constraints: // 1) File is less than 5MB // 2) Content type is an image // 3) Uploaded content type matches existing content type (if it exists) // 4) File name (stored in imageId wildcard variable) is less than 32 characters match /{imageId} { allow write: if request.resource.size < 5 * 1024 * 1024 && request.resource.contentType.matches('image/.*') && (resource == null || request.resource.contentType == resource.contentType) && imageId.size() < 32 } } } }
Ora integriamo Firebase Authentication per un accesso granulare ai file per utente nella sezione Sicurezza dell'utente.