Scopri come proteggere i file

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.