Alle Guides
Schweregrad KritischDatenbanksicherheit

Firebase Security Rules: lass deine Datenbank nicht offen

Firebase-Web-Apps lesen und schreiben Firestore, Realtime Database und Cloud Storage direkt aus dem Browser — mit einem Config-Objekt, das jeder sehen kann. Security Rules sind das Einzige, was entscheidet, ob eine Anfrage erlaubt ist. Rules, die im Test-Modus bleiben oder so gelockert werden, dass sie alles erlauben, legen deine gesamte Datenbank offen fürs Internet.

Was es ist

Security Rules sind eine kleine Policy-Sprache, die bei jedem Lese- und Schreibzugriff auf Googles Servern ausgewertet wird. Jeder match-Block zielt auf einen Pfad — eine Collection, ein Dokument, einen Storage-Ordner —, und allow-Anweisungen legen fest, welche Operationen unter welchen Bedingungen erlaubt sind, anhand von request.auth (wer fragt) und request.resource.data (was geschrieben werden soll).

Die Firebase-Web-Config samt apiKey identifiziert nur dein Projekt; sie ist kein Secret und gewährt für sich genommen keinen Zugriff. Genau deshalb sind die Rules so wichtig: Jeder Besucher kann das Firebase SDK mit deiner Config initialisieren und deine Datenbank direkt aus seiner Browser-Konsole abfragen.

Warum es wichtig ist

Der Test-Modus von Firestore erlaubt alle Lese- und Schreibzugriffe bis zu einem Ablaufdatum. Ist die Frist erreicht und die App funktioniert nicht mehr, lautet ein verbreiteter „Fix“ allow read, write: if true — womit jedes Dokument für die ganze Welt les- und beschreibbar ist. Offene Firebase-Datenbanken sind eine wiederkehrende Quelle großer Datenlecks und lassen sich trivial finden und abziehen.

Rules, die nur request.auth != null prüfen, sind kaum besser: Jeder kann ein Konto anlegen, oft sogar anonym, und dann die Daten aller Nutzer lesen. Ohne Validierung der Schreibzugriffe können Nutzer außerdem Felder ändern, die sie nie kontrollieren dürften — etwa role: "admin" im eigenen Profil setzen.

So behebst du es

Ersetze offene Rules durch eigentümerbasierte Rules

Verweigere standardmäßig alles und gewähre Zugriff pro Collection. Hier kann jeder Nutzer nur sein eigenes Dokument in users lesen und schreiben, alles andere ist nicht erreichbar.

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.
  }
}
Validiere, was Nutzer schreiben dürfen

Beschränke, welche Felder ein Nutzer ändern darf, damit er sich nicht selbst höhere Rechte gibt oder serververwaltete Daten manipuliert. affectedKeys().hasOnly() lehnt jedes Update ab, das andere Felder berührt.

match /users/{userId} {
  allow update: if request.auth.uid == userId
    && request.resource.data.diff(resource.data)
         .affectedKeys().hasOnly(["displayName", "photoURL"]);
}
Entferne rekursive Wildcards und Test-Modus-Rules

Durchsuche deine Rules nach match /{document=**} in Kombination mit einem breiten allow, nach if true und nach ablaufenden Test-Modus-Zeitstempeln. Denk daran, dass Cloud Storage und Realtime Database eigene Rules-Dateien haben — sichere auch diese ab.

Teste deine Rules wie ein Angreifer

Nutze den Rules Playground in der Firebase-Konsole oder die Emulator Suite mit @firebase/rules-unit-testing, um Lesezugriffe als nicht authentifizierter Nutzer und als anderer angemeldeter Nutzer auszuführen. Ein schneller externer Check ist ein nicht authentifizierter REST-Request — liefert er Dokumente zurück, ist die Collection öffentlich.

curl "https://firestore.googleapis.com/v1/projects/<project-id>/databases/(default)/documents/users"

FAQ

Ist mein Firebase apiKey ein Secret?

Nein. Der apiKey in der Firebase-Web-Config identifiziert dein Projekt und ist dafür gedacht, an den Browser ausgeliefert zu werden. Schütze deine Daten mit Security Rules und beschränke den Key in Google Cloud auf die APIs, die deine App tatsächlich nutzt, damit er nicht für andere kostenpflichtige Google-Dienste wiederverwendet werden kann.

Reicht request.auth != null aus?

Selten. Es beweist nur, dass der Anfragende angemeldet ist — nicht, dass ihm die Daten gehören. Vergleiche request.auth.uid mit dem Eigentümer des Dokuments oder prüfe eine Rolle, die Nutzer nicht selbst setzen können.

Prüft AppSafe meine Firebase Rules?

AppSafe fragt dein Firebase-Projekt nicht ab und kann deine Rules daher nicht auswerten — nutze den Rules Playground oder den curl-Check oben. Es meldet aber Google-API-Keys (im Format AIza…), die in deinem JavaScript gefunden werden, weil dasselbe Format auch für kostenpflichtige Dienste wie Maps oder Gemini verwendet wird. Bei einer Firebase-Web-Config ist das zu erwarten; stelle nur sicher, dass der Key eingeschränkt ist.

Ist deine App betroffen?

AppSafe prüft dies und Dutzende weitere Probleme in einem kostenlosen Scan.

Meine App gratis scannen