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 ausgeführt, wenn sie Ihren Regeln entspricht. 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 Hier wird beschrieben, ob und wann Daten geschrieben werden dürfen.
.validate Hier wird definiert, wie ein korrekt formatierter Wert aussehen soll, ob es untergeordnete Attribute gibt und der Datentyp.
.indexOn Hiermit wird ein untergeordnetes Element für die Indexierung angegeben, um die 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.

In Firebase-basierten Apps wird mehr clientseitiger Code ausgeführt als in Apps mit vielen anderen Technologiestacks. Daher ist unser Ansatz in Bezug auf Sicherheit möglicherweise etwas anders 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 Firebase Authentication können Sie Nutzer in Ihrer App anmelden. Firebase Authentication bietet Drop-in-Unterstützung für gängige Authentifizierungsmethoden wie Google und Facebook sowie für die Anmeldung per E-Mail und Passwort, die anonyme Anmeldung und mehr.

Die Nutzeridentität ist ein wichtiges Sicherheitskonzept. Unterschiedliche Nutzer 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 wissen, wer sie sind, benötigen Sie eine Möglichkeit, ihren Zugriff auf Daten in Ihrer Datenbank zu 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 es allen Nutzern erlauben, den Pfad /foo/ zu lesen, aber niemandem, darauf zu schreiben:

{
  "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 ganz einfach Änderungen vornehmen. Sobald Ihre App jedoch für die Bereitstellung 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 Validierungsregeln nicht kaskadieren. Daher müssen alle relevanten Validierungsregeln 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. Mit diesen können Sie Validierungsregeln erstellen, die auf Daten an anderer Stelle in Ihrer Datenbank, auf die Identität des Nutzers, die Serverzeit und vieles mehr achten.

Datenbankindexe definieren

Mit Firebase Realtime Database können Sie Daten sortieren und abfragen. 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