Firebase Realtime Database-Sicherheitsregeln verstehen

Mit Firebase Realtime Database-Sicherheitsregeln legen Sie fest, wer Lese- und Schreibzugriff auf Ihre Datenbank hat, wie Ihre Daten strukturiert sind und welche Indexe vorhanden sind. Diese Regeln werden auf den Firebase-Servern gespeichert und jederzeit automatisch erzwungen. Jede Lese- und Schreibanfrage wird nur abgeschlossen, wenn Ihre Regeln dies zulassen. Standardmäßig gewähren Ihre Regeln niemandem Zugriff auf Ihre Datenbank. So wird Ihre Datenbank vor Missbrauch geschützt, bis Sie Zeit haben, Ihre Regeln anzupassen oder die Authentifizierung einzurichten.

Realtime Database-Sicherheitsregeln haben eine JavaScript-ähnliche Syntax und es gibt vier Arten:

Regeltypen
.read Beschreibt, ob und wann Daten von Nutzern gelesen werden dürfen.
.write Beschreibt, ob und wann Daten geschrieben werden dürfen.
.valid Hier wird definiert, wie ein korrekt formatierter Wert aussehen soll, ob es untergeordnete Attribute gibt und der Datentyp.
.indexOn Gibt ein untergeordnetes Element für den Index an, um Sortierung und Abfrage zu unterstützen.

Realtime Database Sicherheitsübersicht

Die Firebase Realtime Database bietet eine umfassende Palette von Tools zur Verwaltung der Sicherheit Ihrer App. Mit diesen Tools können Sie Nutzer einfach authentifizieren, Nutzerberechtigungen erzwingen und Eingaben validieren.

Auf Firebase basierende Apps führen mehr clientseitigen Code aus als Apps mit vielen anderen Technologiepaketen. Daher kann unser Ansatz für die Sicherheit etwas anders sein, als Sie es gewohnt sind.

Authentifizierung

Ein häufiger erster Schritt bei der Sicherung Ihrer App besteht darin, Ihre Nutzer zu identifizieren. Dieser Vorgang wird als Authentifizierung bezeichnet. Mit der Firebase-Authentifizierung können Sie Nutzer dazu bringen, sich bei Ihrer App anzumelden. Firebase Authentication umfasst Drop-in-Unterstützung für gängige Authentifizierungsmethoden wie Google und Facebook sowie die Anmeldung per E-Mail-Adresse und Passwort, anonyme Anmeldung und mehr.

Die Nutzeridentität ist ein wichtiges Sicherheitskonzept. Unterschiedliche Nutzende haben unterschiedliche Daten und manchmal auch unterschiedliche Funktionen. In einer Chat-Anwendung ist beispielsweise jede Nachricht mit dem Nutzer verknüpft, der sie erstellt hat. Nutzer können möglicherweise auch ihre eigenen Nachrichten löschen, aber nicht Nachrichten, die von anderen Nutzern gepostet wurden.

Autorisierung

Die Identifizierung der Nutzer ist nur ein Teil der Sicherheit. Sobald Sie sie kennen, müssen Sie den Zugriff auf Daten in Ihrer Datenbank steuern. Mit Realtime Database-Sicherheitsregeln können Sie den Zugriff für jeden Nutzer steuern. Im Folgenden finden Sie beispielsweise eine Reihe von Sicherheitsregeln, die zulassen, dass jeder den Pfad /foo/ lesen, aber niemand darin schreiben kann:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

Die Regeln .read und .write werden kaskadiert angewendet. Daher gewährt diese Regelsammlung Lesezugriff auf alle Daten unter dem Pfad /foo/ sowie auf alle tieferen Pfade wie /foo/bar/baz. Beachten Sie, dass Regeln für .read und .write, die sich weiter oben in der Datenbank befinden, Regeln überschreiben, die sich weiter unten befinden. Daher wird in diesem Beispiel der Lesezugriff auf /foo/bar/baz weiterhin gewährt, auch wenn eine Regel für den Pfad /foo/bar/baz als falsch ausgewertet wird.

Die Sicherheitsregeln der Realtime Database enthalten eingebaute Variablen und Funktionen, mit denen Sie unter anderem auf andere Pfade, serverseitige Zeitstempel und Authentifizierungsinformationen verweisen können. Hier ist ein Beispiel für eine Regel, die authentifizierten Nutzern Schreibzugriff auf /users/<uid>/ gewährt. Dabei ist <uid> die ID des Nutzers, die über Firebase Authentication abgerufen wurde.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

Datenvalidierung

Die Firebase Realtime Database ist schemalos. So können Sie während der Entwicklung leicht Änderungen vornehmen. Sobald Ihre App jedoch für die Verteilung bereit ist, müssen die Daten einheitlich bleiben. Die Regelsprache enthält eine .validate-Regel, mit der Sie Validierungslogik mit denselben Ausdrücken anwenden können, die auch für .read- und .write-Regeln verwendet werden. Der einzige Unterschied besteht darin, dass Gültigkeitsregeln nicht kaskadieren. Daher müssen alle relevanten Gültigkeitsregeln als wahr ausgewertet werden, damit die Schreibvorgänge zulässig sind.

Mit dieser Regel wird festgelegt, dass Daten, die in /foo/ geschrieben werden, ein String mit weniger als 100 Zeichen sein müssen:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Validierungsregeln haben Zugriff auf dieselben integrierten Funktionen und Variablen wie .read- und .write-Regeln. Sie können diese verwenden, um Validierungsregeln zu erstellen, die Daten an anderer Stelle in Ihrer Datenbank, die Identität Ihrer Nutzer, die Serverzeit und vieles mehr berücksichtigen.

Datenbankindexe definieren

Firebase Realtime Database ermöglicht das Sortieren und Abfragen von Daten. Bei kleinen Datenmengen unterstützt die Datenbank Ad-hoc-Abfragen, sodass während der Entwicklung in der Regel keine Indizes erforderlich sind. Bevor Sie Ihre App veröffentlichen, ist es jedoch wichtig, Indizes für alle Abfragen anzugeben, damit sie auch dann funktionieren, wenn Ihre App wächst.

Indexe werden mit der Regel .indexOn angegeben. Hier ist ein Beispiel für eine Indexdeklaration, mit der die Felder „Höhe“ und „Länge“ für eine Liste von Dinosauriern indexiert werden:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Nächste Schritte