Verstehen Sie die Sicherheitsregeln für Firebase-Echtzeitdatenbanken

Firebase Realtime Database Security Rules bestimmen, wer Lese- und Schreibzugriff auf Ihre Datenbank hat, wie Ihre Daten strukturiert sind und welche Indizes vorhanden sind. Diese Regeln leben auf den Firebase-Servern und werden jederzeit automatisch durchgesetzt. Jede Lese- und Schreibanforderung wird nur dann ausgeführt, wenn Ihre Regeln dies zulassen. Standardmäßig gestatten Ihre Regeln niemandem den Zugriff auf Ihre Datenbank. Dies dient dazu, Ihre Datenbank vor Missbrauch zu schützen, bis Sie Zeit haben, Ihre Regeln anzupassen oder die Authentifizierung einzurichten.

Echtzeit-Datenbanksicherheitsregeln haben eine JavaScript-ähnliche Syntax und sind in vier Typen erhältlich:

Regeltypen
.lesen Beschreibt, ob und wann Daten von Benutzern gelesen werden dürfen.
.schreiben Beschreibt, ob und wann Daten geschrieben werden dürfen.
.bestätigen Definiert, wie ein korrekt formatierter Wert aussieht, ob er über untergeordnete Attribute verfügt und welchen Datentyp er hat.
.indexOn Gibt ein zu indizierendes untergeordnetes Element an, um das Sortieren und Abfragen zu unterstützen.

Übersicht über die Sicherheit der Echtzeitdatenbank

Die Firebase-Echtzeitdatenbank bietet einen vollständigen Satz an Tools zum Verwalten der Sicherheit Ihrer App. Diese Tools erleichtern die Authentifizierung Ihrer Benutzer, die Durchsetzung von Benutzerberechtigungen und die Validierung von Eingaben.

Auf Firebase-basierten Apps wird mehr clientseitiger Code ausgeführt als auf Apps mit vielen anderen Technologie-Stacks. Daher kann es sein, dass wir mit der Sicherheit etwas anders umgehen, als Sie es gewohnt sind.

Authentifizierung

Ein üblicher erster Schritt zur Sicherung Ihrer App ist die Identifizierung Ihrer Benutzer. Dieser Vorgang wird als Authentifizierung bezeichnet. Sie können die Firebase-Authentifizierung verwenden, damit sich Benutzer bei Ihrer App anmelden können. Die Firebase-Authentifizierung umfasst Drop-in-Unterstützung für gängige Authentifizierungsmethoden wie Google und Facebook sowie E-Mail- und Passwort-Anmeldung, anonyme Anmeldung und mehr.

Die Benutzeridentität ist ein wichtiges Sicherheitskonzept. Unterschiedliche Benutzer verfügen über unterschiedliche Daten und manchmal auch über unterschiedliche Fähigkeiten. In einer Chat-Anwendung ist beispielsweise jede Nachricht dem Benutzer zugeordnet, der sie erstellt hat. Benutzer können möglicherweise auch ihre eigenen Nachrichten löschen, jedoch keine von anderen Benutzern geposteten Nachrichten.

Genehmigung

Die Identifizierung Ihres Benutzers 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 kontrollieren. Mithilfe von Echtzeit-Datenbanksicherheitsregeln können Sie den Zugriff für jeden Benutzer steuern. Hier ist zum Beispiel eine Reihe von Sicherheitsregeln, die es jedem erlauben, den Pfad /foo/ zu lesen, aber niemand, darauf zu schreiben:

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

.read und .write Regeln kaskadieren, sodass dieser Regelsatz Lesezugriff auf alle Daten im Pfad /foo/ sowie auf allen tieferen Pfaden wie /foo/bar/baz gewährt. Beachten Sie, dass .read und .write Regeln, die in der Datenbank flacher sind, tiefere Regeln überschreiben, sodass in diesem Beispiel weiterhin Lesezugriff auf /foo/bar/baz gewährt wird, selbst wenn eine Regel im Pfad /foo/bar/baz als falsch ausgewertet wird.

Die Echtzeit-Datenbanksicherheitsregeln umfassen integrierte Variablen und Funktionen, die es Ihnen ermöglichen, auf andere Pfade, serverseitige Zeitstempel, Authentifizierungsinformationen und mehr zu verweisen. Hier ist ein Beispiel für eine Regel, die authentifizierten Benutzern Schreibzugriff auf /users/<uid>/ gewährt, wobei <uid> die ID des Benutzers ist, die über die Firebase-Authentifizierung erhalten wurde.

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

Datenvalidierung

Die Firebase-Echtzeitdatenbank ist schemalos. Dies macht es einfach, Dinge während der Entwicklung zu ändern. Sobald Ihre App jedoch zur Verteilung bereit ist, ist es wichtig, dass die Daten konsistent bleiben. Die Regelsprache umfasst eine .validate Regel, die es Ihnen ermöglicht, Validierungslogik mit denselben Ausdrücken anzuwenden, die für .read und .write -Regeln verwendet werden. Der einzige Unterschied besteht darin, dass Validierungsregeln nicht kaskadiert werden , sodass alle relevanten Validierungsregeln als „true“ ausgewertet werden müssen, damit der Schreibvorgang zulässig ist.

Diese Regeln erzwingen, dass nach /foo/ geschriebene Daten eine Zeichenfolge mit weniger als 100 Zeichen sein müssen:

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

Validierungsregeln haben Zugriff auf alle 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 Ihres Benutzers, die Serverzeit und vieles mehr berücksichtigen.

Definieren von Datenbankindizes

Die Firebase Realtime Database ermöglicht das Bestellen und Abfragen von Daten. Bei kleinen Datenmengen unterstützt die Datenbank Ad-hoc-Abfragen, sodass während der Entwicklung im Allgemeinen keine Indizes erforderlich sind. Bevor Sie Ihre App starten, ist es jedoch wichtig, Indizes für alle erforderlichen Abfragen anzugeben, um sicherzustellen, dass sie auch dann weiterhin funktionieren, wenn Ihre App wächst.

Indizes werden mithilfe der .indexOn Regel angegeben. Hier ist eine Beispiel-Indexdeklaration, die die Felder „Höhe“ und „Länge“ für eine Liste von Dinosauriern indizieren würde:

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

Nächste Schritte