Firebase Security Rules : ne laissez plus votre base de données ouverte
Les applications web Firebase lisent et écrivent dans Firestore, Realtime Database et Cloud Storage directement depuis le navigateur, à l’aide d’un objet de configuration visible par tous. Les Security Rules sont la seule chose qui décide si une requête est autorisée. Des règles laissées en mode test, ou assouplies pour tout autoriser, exposent toute votre base de données à Internet.
Ce que c’est
Les Security Rules sont un petit langage de règles évalué sur les serveurs de Google à chaque lecture et écriture. Chaque bloc match cible un chemin — une collection, un document, un dossier de stockage — et les instructions allow indiquent quelles opérations sont permises et à quelles conditions, à l’aide de request.auth (qui fait la demande) et de request.resource.data (ce que l’on essaie d’écrire).
La config web Firebase, y compris son apiKey, ne fait qu’identifier votre projet ; ce n’est pas un secret et elle ne donne aucun accès à elle seule. C’est pourquoi les règles comptent autant : n’importe quel visiteur peut initialiser le SDK Firebase avec votre config et interroger votre base de données directement depuis la console de son navigateur.
Pourquoi ça compte
Le mode test de Firestore autorise toutes les lectures et écritures jusqu’à une date d’expiration. Quand l’échéance arrive et que l’app cesse de fonctionner, un « correctif » courant est allow read, write: if true — ce qui rend chaque document lisible et modifiable par le monde entier. Les bases Firebase exposées sont une source récurrente de fuites de données massives, et elles sont triviales à trouver et à aspirer.
Les règles qui vérifient seulement request.auth != null ne valent guère mieux : n’importe qui peut créer un compte, souvent anonymement, puis lire les données de tous les utilisateurs. Sans validation des écritures, les utilisateurs peuvent aussi modifier des champs qu’ils ne devraient jamais contrôler — par exemple définir role: "admin" sur leur propre profil.
Comment corriger
Refusez tout par défaut et accordez l’accès collection par collection. Ici, chaque utilisateur ne peut lire et écrire que son propre document dans users, et rien d’autre n’est accessible.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}
// Every other path is denied by default.
}
}Limitez les champs qu’un utilisateur peut modifier, pour qu’il ne puisse pas s’octroyer des privilèges ni altérer des données gérées par le serveur. affectedKeys().hasOnly() rejette toute mise à jour qui touche d’autres champs.
match /users/{userId} {
allow update: if request.auth.uid == userId
&& request.resource.data.diff(resource.data)
.affectedKeys().hasOnly(["displayName", "photoURL"]);
}Cherchez dans vos règles les match /{document=**} combinés à un allow trop large, les if true et les horodatages d’expiration du mode test. N’oubliez pas que Cloud Storage et Realtime Database ont leurs propres fichiers de règles — verrouillez-les aussi.
Utilisez le Rules Playground de la console Firebase ou l’Emulator Suite avec @firebase/rules-unit-testing pour exécuter des lectures en tant qu’utilisateur non authentifié et en tant qu’autre utilisateur connecté. Une vérification externe rapide consiste à envoyer une requête REST non authentifiée : si elle renvoie des documents, la collection est publique.
curl "https://firestore.googleapis.com/v1/projects/<project-id>/databases/(default)/documents/users"FAQ
Mon apiKey Firebase est-elle un secret ?
Non. L’apiKey de la config web Firebase identifie votre projet et est faite pour être livrée au navigateur. Protégez vos données avec les Security Rules, et restreignez la clé dans Google Cloud aux API réellement utilisées par votre app, afin qu’elle ne puisse pas être réutilisée pour d’autres services Google facturables.
request.auth != null suffit-il ?
Rarement. Cela prouve seulement que l’auteur de la requête est connecté — pas que les données lui appartiennent. Comparez request.auth.uid au propriétaire du document, ou vérifiez un rôle que les utilisateurs ne peuvent pas définir eux-mêmes.
AppSafe vérifie-t-il mes règles Firebase ?
AppSafe n’interroge pas votre projet Firebase, il ne peut donc pas évaluer vos règles — utilisez le Rules Playground ou la vérification curl ci-dessus. En revanche, il signale les clés d’API Google (au format AIza…) trouvées dans votre JavaScript, car ce même format sert à des services facturables comme Maps ou Gemini. Pour une config web Firebase, c’est normal ; assurez-vous simplement que la clé est restreinte.
Votre app est-elle concernée ?
AppSafe détecte ce problème et des dizaines d’autres en un seul scan gratuit.
Scanner mon app gratuitementGuides liés
Supabase Row Level Security (RLS) : verrouillez vos tables
Votre anon key est publique. Le RLS est la seule chose qui la sépare de vos données.
API keys exposées dans le JavaScript côté client
Tout ce qui est dans votre bundle est public. Traitez-le comme tel.
Sauvegardes de base de données exposées : que se passe-t-il quand /backup.sql est accessible
Un dump .sql accessible, c'est la remise complète de toute votre base de données.