Découvrir comment sécuriser des fichiers

Cloud Storage for Firebase fournit un modèle de sécurité basé sur un chemin déclaratif appelé Firebase Security Rules pour Cloud Storage, qui vous permet de sécuriser vos fichiers rapidement et facilement.

Comprendre les règles

Les Firebase Security Rules pour Cloud Storage permettent de déterminer qui a accès en lecture et en écriture l'accès aux fichiers stockés dans Cloud Storage, ainsi que la manière dont les fichiers sont structurées et les métadonnées qu'elles contiennent. Le type de règle de base est allow qui autorise les requêtes read et write si une valeur est spécifiée condition est spécifiée, par exemple:

// 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>;

Chemins correspondants

Cloud Storage Security Rules match les chemins d'accès utilisés pour accéder aux fichiers dans Cloud Storage Les règles peuvent match des chemins d'accès exacts ou des chemins d'accès génériques. peuvent également être imbriquées. Si aucune règle de correspondance n'autorise une méthode de requête, ou si la prend la valeur false, la requête est refusée.

Correspondances exactes

// 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>;
}

Correspondances imbriquées

// 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>;
  }
}

Correspondances de caractères génériques

Les règles peuvent également être utilisées pour match un modèle à l'aide de caractères génériques. Un caractère générique est un variable nommée qui représente une seule chaîne, telle que profilePhoto.png, ou plusieurs segments de chemin d'accès, tels que images/profilePhoto.png

Un caractère générique est créé en ajoutant des accolades autour du nom générique, comme {string} Vous pouvez déclarer un caractère générique pour plusieurs segments en ajoutant =** à la un nom générique, comme {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>;
  }
}

Si plusieurs règles correspondent à un fichier, le résultat est le OR du résultat de toutes des évaluations de règles. Autrement dit, si une règle correspondante au fichier renvoie la valeur true, le résultat est true.

Dans les règles ci-dessus, le fichier "images/profilePhoto.png" peut être lu si condition ou other_condition a la valeur "true", tandis que le fichier "images/users/user:12345/profilePhoto.png" n'est sujette qu'au résultat other_condition

Une variable générique peut être référencée à partir du fichier de fourniture match. nom ou autorisation de chemin d'accès:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Les Cloud Storage Security Rules ne sont pas en cascade, et les règles ne sont évaluées que lorsque l'attribut chemin de requête correspond à un chemin avec des règles spécifiées.

Demander une évaluation

Les importations, les téléchargements, les modifications de métadonnées et les suppressions sont évalués à l'aide du request envoyés à Cloud Storage. La variable request contient le chemin d'accès au fichier où la requête est exécutée, l'heure à laquelle la requête est reçue et la nouvelle valeur resource si la requête est une écriture. Les en-têtes HTTP et l'état d'authentification sont également inclus.

L'objet request contient également l'ID unique de l'utilisateur et la charge utile Firebase Authentication dans l'objet request.auth, qui sera expliquée plus en détail dans la section Sécurité basée sur l'utilisateur de la documentation.

Vous trouverez ci-dessous la liste complète des propriétés de l'objet request:

Propriété Type Description
auth map<chaîne, chaîne> Lorsqu'un utilisateur est connecté, fournit uid, son identifiant unique et token, une carte de Firebase Authentication revendications JWT. Sinon, il est défini sur null.
params map<chaîne, chaîne> Carte contenant les paramètres de la requête.
path chemin d'accès Un path représentant le chemin d'accès de la requête à l'issue de ce cours.
resource map<chaîne, chaîne> Nouvelle valeur de la ressource, présente uniquement dans les requêtes write.
time timestamp Code temporel représentant l'heure du serveur à laquelle la requête est évaluée.

Évaluation des ressources

Lors de l'évaluation des règles, vous pouvez également évaluer les métadonnées du fichier en cours d'importation, de téléchargement, de modification ou de suppression. Cela vous permet de créer des règles complexes et performantes, par exemple, n'autoriser que les fichiers contenant de types de contenu à importer, ou uniquement les fichiers dont la taille dépasse un certain seuil supprimés.

Firebase Security Rules pour Cloud Storage fournit des métadonnées de fichier dans resource qui contient des paires clé/valeur des métadonnées affichées dans Cloud Storage. Ces propriétés peuvent être inspectées sur read ou write pour garantir l'intégrité des données.

Pour les requêtes write (importations, mises à jour de métadonnées et suppressions, par exemple), dans ainsi que l'objet resource, qui contient les métadonnées du fichier existant dans le chemin de requête, vous avez également la possibilité d'utiliser request.resource, qui contient un sous-ensemble des métadonnées du fichier à écrit si l'écriture est autorisée. Vous pouvez utiliser ces deux valeurs pour vous assurer que les données l'intégrité ou appliquer des contraintes d'application telles que le type ou la taille du fichier.

Vous trouverez ci-dessous la liste complète des propriétés de l'objet resource:

Propriété Type Description
name chaîne Nom complet de l'objet
bucket chaîne Nom du bucket dans lequel se trouve cet objet.
generation int L'API GCS génération de l'objet de cet objet.
metageneration int Métagénération de l'objet GCS de cet objet.
size int La taille de l'objet en octets.
timeCreated timestamp Code temporel représentant l'heure de création d'un objet.
updated timestamp Code temporel représentant l'heure de la dernière mise à jour d'un objet.
md5Hash chaîne Hachage MD5 de l'objet.
crc32c chaîne Hachage crc32c de l'objet.
etag chaîne ETag associé à cet objet.
contentDisposition chaîne Disposition du contenu associée à cet objet.
contentEncoding chaîne Encodage du contenu associé à cet objet.
contentLanguage chaîne Langue du contenu associée à cet objet.
contentType chaîne Type de contenu associé à cet objet.
metadata map<chaîne, chaîne> Paires clé/valeur de métadonnées personnalisées supplémentaires spécifiées par le développeur.

request.resource contient tous ces éléments, à l'exception de generation, metageneration, etag, timeCreated et updated.

Exemple complet

En combinant toutes ces données, vous pouvez créer un exemple complet de règles pour une image. solution de stockage:

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

Intégrons maintenant Firebase Authentication pour un accès aux fichiers précis par utilisateur dans la section Sécurité des utilisateurs.