Corriger les règles non sécurisées

Utilisez ce guide pour comprendre les vulnérabilités courantes dans les configurations des règles de sécurité Cloud Firestore, examiner et mieux sécuriser vos propres règles, et tester vos modifications avant de les déployer.

Si vous recevez une alerte indiquant que votre base de données Cloud Firestore n'est pas correctement sécurisée, vous pouvez résoudre les vulnérabilités en modifiant et en testant vos règles de sécurité Cloud Firestore.

Pour afficher vos règles de sécurité existantes, accédez à l' onglet Règles de la console Firebase.

Comprendre vos règles de sécurité Cloud Firestore

Les règles de sécurité Cloud Firestore protègent vos données des utilisateurs malveillants. Les règles par défaut de toute instance Cloud Firestore créée dans la console Firebase refusent l'accès à tous les utilisateurs. Pour développer votre application et accéder à votre base de données, vous devrez modifier ces règles et envisager d'accorder un accès global à tous les utilisateurs dans un environnement de développement. Toutefois, avant de déployer votre application dans un environnement de production, prenez le temps de bien configurer vos règles et de sécuriser vos données.

Pendant que vous développez votre application et testez différentes configurations pour vos règles, utilisez l' émulateur Cloud Firestore pour exécuter votre application dans un environnement de développement local.

Scénarios courants avec des règles non sécurisées

Les règles de sécurité Cloud Firestore que vous avez peut-être configurées par défaut ou lorsque vous avez initialement travaillé sur le développement de votre application avec Cloud Firestore doivent être examinées et mises à jour avant de déployer votre application. Assurez-vous de bien sécuriser les données de vos utilisateurs en évitant les pièges courants suivants.

Accès ouvert

Lors de la configuration de Cloud Firestore, vous avez peut-être défini vos règles pour autoriser le libre accès pendant le développement. Vous pensez peut-être que vous êtes la seule personne à utiliser votre application, mais si vous l'avez déployée, elle est disponible sur Internet. Si vous n'authentifiez pas les utilisateurs et ne configurez pas de règles de sécurité, toute personne devinant l'ID de votre projet peut voler, modifier ou supprimer les données.

Non recommandé : accès en lecture et en écriture à tous les utilisateurs.
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
Solution : règles qui restreignent l'accès en lecture et en écriture.

Créez des règles adaptées à votre hiérarchie de données. L'une des solutions courantes à cette insécurité est la sécurité basée sur l'utilisateur avec l'authentification Firebase. En savoir plus sur l'authentification des utilisateurs avec des règles .

Propriétaire du contenu uniquement

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      allow read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Accès mixte public et privé

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Accès pour tout utilisateur authentifié

Parfois, les règles de sécurité Cloud Firestore vérifient qu'un utilisateur est connecté, mais ne restreignent pas davantage l'accès en fonction de cette authentification. Si l'une de vos règles inclut auth != null , confirmez que vous souhaitez que tout utilisateur connecté ait accès aux données.

Non recommandé : tout utilisateur connecté dispose d'un accès en lecture et en écriture à l'intégralité de votre base de données.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
Solution : restreindre l'accès à l'aide de conditions de sécurité.

Lorsque vous vérifiez l'authentification, vous souhaiterez peut-être également utiliser l'une des propriétés d'authentification pour restreindre davantage l'accès à des utilisateurs spécifiques pour des ensembles de données spécifiques. En savoir plus sur l'ajout de conditions de sécurité et d'un accès basé sur les rôles .

Accès basé sur les rôles

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

Accès basé sur les attributs

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

Accès mixte public et privé

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Accès fermé

Pendant que vous développez votre application, une autre approche courante consiste à verrouiller vos données. En règle générale, cela signifie que vous avez fermé l'accès en lecture et en écriture à tous les utilisateurs, comme suit :

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Les SDK Firebase Admin et Cloud Functions peuvent toujours accéder à votre base de données. Utilisez ces règles lorsque vous avez l'intention d'utiliser Cloud Firestore comme backend serveur uniquement en conjonction avec le SDK Firebase Admin. Bien qu'elle soit sécurisée, vous devez vérifier que les clients de votre application peuvent récupérer correctement les données.

Apprenez-en davantage sur les règles de sécurité Cloud Firestore et leur fonctionnement dans la section Premiers pas avec les règles de sécurité Cloud Firestore .

Vérifiez vos règles de sécurité Cloud Firestore

Pour vérifier le comportement de votre application et vérifier vos configurations de règles de sécurité Cloud Firestore, utilisez l' émulateur Cloud Firestore . Utilisez l'émulateur Cloud Firestore pour exécuter et automatiser des tests unitaires dans un environnement local avant de déployer des modifications.

Pour tester rapidement vos règles de sécurité Cloud Firestore mises à jour dans la console Firebase, utilisez l'outil Rules Playground.

  1. Pour ouvrir le terrain de jeu de règles, cliquez sur Terrain de jeu de règles dans l' onglet Règles .
  2. Dans les paramètres du terrain de jeu des règles , sélectionnez les options pour votre test, notamment :
    • Tester les lectures ou les écritures
    • Un emplacement spécifique dans votre base de données, sous forme de chemin
    • Type d'authentification : utilisateur anonyme non authentifié, authentifié ou identifiant d'utilisateur spécifique
    • Données spécifiques au document auxquelles vos règles font spécifiquement référence (par exemple, si vos règles nécessitent la présence d'un champ spécifique avant d'autoriser une écriture)
  3. Cliquez sur Exécuter et recherchez les résultats dans la bannière au-dessus de la fenêtre des règles.