FixVibe

// docs / baas security / firebase if-true explainer

Firebase allow read, write: if true expliqué : ce que cela fait et comment le corriger

<code>allow read, write: if true;</code> est la mauvaise configuration Firebase la plus courante en production. C'est le défaut du mode test que la console Firebase suggère lorsque vous créez une nouvelle base de données, la règle que les outils de codage IA régénèrent depuis la documentation, et la règle qui ouvre toute votre base de données Firestore à n'importe qui sur Internet. Cet article explique la syntaxe précisément, montre ce qu'un attaquant voit lorsque cette règle est active, et vous donne quatre remplacements progressivement plus stricts adaptés à différents cas d'usage.

La syntaxe, ligne par ligne

Un document complet de règles Firestore en mode test fait six lignes :

firebase
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Décodé :

  • rules_version = '2'; sélectionne le moteur de règles v2 (actuel). Les anciennes règles v1 sont dépréciées.
  • service cloud.firestore limite le bloc à Firestore. Realtime Database utilise une syntaxe basée JSON différente ; Cloud Storage utilise service firebase.storage.
  • match /databases/{database}/documents lie la base de données spéciale (default) (la plupart des projets n'en ont qu'une).
  • match /{document=**} est un joker récursif. Le ** correspond à n'importe quel chemin de n'importe quelle profondeur. Combiné à {document}, cela capture chaque document dans chaque collection — une unique clause match gouvernant toute la base de données.
  • allow read, write: if true; est le corps de la règle. À la fois read et write sont autorisés ; la condition if true est, eh bien, toujours vraie. read couvre les opérations get et list ; write couvre create, update et delete.

Effet net : tout client avec l'ID de projet Firebase et le bon SDK peut lire ou écrire n'importe quel document dans n'importe quelle collection. L'authentification n'est pas requise. Les limites de taux ne sont pas appliquées.

Pourquoi Firebase livre ceci comme défaut

Firebase veut que vous codiez dans les 30 premières secondes après la création d'un projet. L'alternative — vous forcer à écrire une règle correcte avant que toute lecture ou écriture ne fonctionne — bloquerait l'onboarding. Donc la console offre deux options lorsque vous créez une base de données : Mode production (tout refuser, vous écrivez les règles) ou Mode test (tout autoriser pendant 30 jours). La plupart des développeurs cliquent sur mode test, puis oublient d'y revenir. Les anciens projets avaient le minuteur de 30 jours ; les projets actuels ont une règle if true indéfinie sans expiration automatique.

Le problème structurel : les outils de codage IA s'entraînent sur de la documentation, des tutoriels et des réponses Stack Overflow qui montrent des règles en mode test. Quand vous demandez à Cursor ou Claude Code « comment configurer Firebase », la réponse inclut souvent le bloc exact allow read, write: if true comme s'il s'agissait de la règle de production. L'IA ne sait pas — et n'est pas invitée à savoir — que cette règle n'est pas sûre pour la production.

Ce qu'un attaquant voit

Concrètement, un attaquant qui connaît votre ID de projet Firebase (extractible du bundle de n'importe quelle application déployée en 30 secondes) et exécute ce qui suit peut lister chaque document dans chaque collection :

Une seule requête curl non authentifiée suffit pour énumérer chaque collection. Voir le bloc mis en évidence ci-dessous.

bash
curl 'https://firestore.googleapis.com/v1/projects/[project-id]/databases/(default)/documents:listCollectionIds' \
  -X POST \
  -H 'Content-Type: application/json' \
  -d '{}'

La réponse est la liste complète des collections de premier niveau. Pour chaque collection, une seconde requête renvoie les documents. Il n'y a pas de limite de taux sur ce chemin parce que les règles if true acceptent le trafic anonyme. Nous avons vu des bases de données Firebase avec des millions de documents énumérées en moins d'une heure.

Sur le chemin d'écriture : un seul POST avec {fields} crée un nouveau document. Les attaquants peuvent polluer vos collections avec des déchets, défigurer des pages côté utilisateur qui lisent depuis Firestore ou utiliser votre base de données comme un broker de messages gratuit — votre facture d'utilisation explose, vous enquêtez, la facture explique le problème.

Quatre remplacements sûrs pour la production

Choisissez le remplacement qui correspond au modèle de données de votre application. Les quatre supposent que vous avez une authentification utilisateur (Firebase Auth ou tout fournisseur qui émet un token ID Firebase) :

Option 1 : documents possédés par l'utilisateur

Motif SaaS le plus courant. Les documents vivent sous /users/{userId}/... et seul le propriétaire peut les toucher. match /users/{userId}/{document=**} { allow read, write: if request.auth != null && request.auth.uid == userId; }

firebase
match /users/{userId}/{document=**} {
  allow read, write: if request.auth != null
                     && request.auth.uid == userId;
}

Option 2 : champ propriétaire sur chaque document

Quand les documents vivent dans des collections plates (non imbriqués sous l'ID utilisateur), stockez un champ owner_uid et vérifiez-le. match /posts/{postId} { allow read: if resource.data.public == true || resource.data.owner_uid == request.auth.uid; allow write: if request.auth.uid == resource.data.owner_uid; }

firebase
match /posts/{postId} {
  allow read:  if resource.data.public == true
              || resource.data.owner_uid == request.auth.uid;
  allow write: if request.auth.uid == resource.data.owner_uid;
}

Option 3 : isolation multi-tenant par org

Pour SaaS B2B avec données limitées par org. Stockez un champ org_id sur chaque document et vérifiez-le contre le custom claim de l'utilisateur. allow read, write: if request.auth.token.org_id == resource.data.org_id;. Nécessite de définir le custom claim lors de l'inscription via le SDK Admin Firebase.

firebase
allow read, write: if request.auth.token.org_id == resource.data.org_id;

Option 4 : contenu public en lecture seule

Pour le contenu marketing, les profils publics, les catalogues de produits — tout ce qui est véritablement en lecture publique mais en écriture admin uniquement. match /products/{productId} { allow read: if true; allow write: if request.auth.token.admin == true; }. Le custom claim admin n'est défini que sur les comptes admin.

firebase
match /products/{productId} {
  allow read:  if true;
  allow write: if request.auth.token.admin == true;
}

Requête d'audit rapide

Avant de corriger, vérifiez si if true est effectivement actif. Ouvrez Console Firebase → Firestore → Rules et cherchez if true. Si vous le trouvez n'importe où en dehors d'un commentaire, vous avez un résultat de règle ouverte. Le simulateur de règles dans la même UI vous permet de rejouer la requête de l'attaquant localement — collez un GET /users/somebody anonyme et confirmez que le simulateur retourne Allowed.

Confirmation externe : lancez un scan FixVibe contre votre URL de production. Le check baas.firebase-rules sonde vos règles Firestore, Realtime Database et Storage et signale le même résultat qu'un attaquant découvrirait — indépendamment de ce que montre la console Firebase.

Questions fréquentes

Quelle est la différence entre <code>if true</code> et <code>if request.auth != null</code> ?

if true autorise l'accès anonyme — n'importe qui sur Internet. if request.auth != null requiert n'importe quel utilisateur connecté, ce qui est mieux mais toujours mauvais : n'importe quel utilisateur de votre application peut lire les données de tout autre utilisateur. Les règles de production doivent être limitées à l'utilisateur ou à l'org spécifique via request.auth.uid == resource.data.owner_uid ou similaire.

Firebase fait-il expirer automatiquement les règles <code>if true</code> ?

Les anciens projets (pré-2023) avaient un minuteur de 30 jours qui convertissait les règles if true en if false. Les projets actuels ne le font pas — la règle persiste indéfiniment jusqu'à remplacement manuel. Si vous avez créé votre projet avant 2023 et que vos règles semblent correctes, vérifiez deux fois : le minuteur a peut-être déjà basculé sur if false, ce qui bloque votre propre application.

Puis-je utiliser une vérification d'horodatage à date future comme filet de sécurité ?

Non — une condition d'horodatage n'est pas un contrôle de sécurité. Elle fait expirer la règle ouverte à une date future, ce qui signifie que jusqu'à cette date les attaquants ont un accès complet. Et vous oublierez la date. Remplacez if true par une règle limitée par l'authentification, pas par une règle limitée dans le temps.

Que se passe-t-il si mon application est véritablement en lecture publique (blog, catalogue produits) ?

Alors écrivez explicitement allow read: if true; allow write: if false; uniquement sur la collection publique — pas sur chaque collection de votre base de données. Utilisez une clause match séparée par collection et n'utilisez jamais le joker récursif {document=**} sur des règles modifiables.

Étapes suivantes

Lancez un scan FixVibe contre votre URL de production — le check baas.firebase-rules confirme si if true est actuellement exploitable depuis l'Internet public. Pour les mécanismes du scanner et les détections parallèles pour Realtime Database et Storage, voir Scanner de règles Firebase. Pour la classe équivalente de mauvaise configuration sur Supabase, lisez Scanner RLS Supabase.

// scannez votre surface baas

Trouvez la table ouverte avant qu'un autre ne le fasse.

Entrez une URL de production. FixVibe énumère les fournisseurs BaaS avec lesquels votre application communique, identifie leurs endpoints publics et signale ce qu'un client non authentifié peut lire ou écrire. Gratuit, sans installation, sans carte.

  • Offre gratuite — 3 scans / mois, sans carte d'inscription.
  • Identification BaaS passive — aucune vérification de domaine requise.
  • Supabase, Firebase, Clerk, Auth0, Appwrite et plus.
  • Prompts de correction IA sur chaque résultat — collez-les dans Cursor / Claude Code.
Lancer un scan BaaS gratuit

aucune inscription requise

Firebase allow read, write: if true expliqué : ce que cela fait et comment le corriger — Docs · FixVibe