Machen Sie sich mit den Sicherheitsregeln für Firebase-Echtzeitdatenbanken vertraut

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 befinden sich auf den Firebase-Servern und werden jederzeit automatisch durchgesetzt. Jede Lese- und Schreibanforderung wird nur ausgeführt, wenn Ihre Regeln dies zulassen. Standardmäßig erlauben Ihre Regeln niemandem den Zugriff auf Ihre Datenbank. Dies soll Ihre Datenbank vor Missbrauch 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 untergeordnete Attribute hat, und den Datentyp.
.indexOn Gibt ein untergeordnetes Element an, das indiziert werden soll, um das Sortieren und Abfragen zu unterstützen.

Überblick über die Sicherheit von Echtzeitdatenbanken

Die Firebase-Echtzeitdatenbank bietet einen vollständigen Satz von Tools zum Verwalten der Sicherheit Ihrer App. Diese Tools machen es einfach, Ihre Benutzer zu authentifizieren, Benutzerberechtigungen durchzusetzen und Eingaben zu validieren.

Firebase-basierte Apps führen mehr clientseitigen Code aus als solche mit vielen anderen Technologie-Stacks. Daher kann unsere Herangehensweise an die Sicherheit etwas anders sein, als Sie es gewohnt sind.

Authentifizierung

Ein gängiger erster Schritt zur Sicherung Ihrer App ist die Identifizierung Ihrer Benutzer. Dieser Vorgang wird Authentifizierung genannt. 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 Kennwortanmeldung, anonyme Anmeldung und mehr.

Die Benutzeridentität ist ein wichtiges Sicherheitskonzept. Verschiedene Benutzer haben unterschiedliche Daten und manchmal haben sie unterschiedliche Fähigkeiten. Beispielsweise wird in einer Chat-Anwendung jede Nachricht dem Benutzer zugeordnet, der sie erstellt hat. Benutzer können möglicherweise auch ihre eigenen Nachrichten löschen, jedoch keine Nachrichten, die von anderen Benutzern gepostet wurden.

Genehmigung

Die Identifizierung Ihres Benutzers ist nur ein Teil der Sicherheit. Sobald Sie wissen, wer sie sind, brauchen Sie eine Möglichkeit, ihren Zugriff auf Daten in Ihrer Datenbank zu kontrollieren. Mit 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 niemanden 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 alle tieferen Pfade wie /foo/bar/baz gewährt. Beachten Sie, dass flachere .read und .write Regeln in der Datenbank tiefere Regeln außer Kraft setzen, sodass in diesem Beispiel weiterhin Lesezugriff auf /foo/bar/baz gewährt würde, selbst wenn eine Regel im Pfad /foo/bar/baz als „false“ ausgewertet wird.

Die Echtzeit-Datenbanksicherheitsregeln enthalten integrierte Variablen und Funktionen, mit denen Sie auf andere Pfade, serverseitige Zeitstempel, Authentifizierungsinformationen und mehr verweisen können. 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 abgerufen wurde.

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

Datenvalidierung

Die Firebase Realtime Database ist schemalos. Dies macht es einfach, Dinge während der Entwicklung zu ändern, aber sobald Ihre App zur Verteilung bereit ist, ist es wichtig, dass die Daten konsistent bleiben. Die Regelsprache enthält eine .validate Regel, mit der Sie Validierungslogik anwenden können, indem Sie dieselben Ausdrücke verwenden, die für .read und .write -Regeln verwendet werden. Der einzige Unterschied besteht darin, dass Validierungsregeln nicht kaskadiert werden , sodass alle relevanten Validierungsregeln als wahr ausgewertet werden müssen, damit der Schreibvorgang zugelassen wird.

Diese Regel erzwingt, dass Daten, die in /foo/ geschrieben werden, eine Zeichenfolge 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 Ihres Benutzers, die Serverzeit und vieles mehr kennen.

Datenbankindizes definieren

Die Firebase Realtime Database ermöglicht das Bestellen und Abfragen von Daten. Bei kleinen Datengrößen 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 Abfragen anzugeben, die Sie benötigen, um sicherzustellen, dass sie weiterhin funktionieren, wenn Ihre App wächst.

Indizes werden mithilfe der .indexOn Regel angegeben. Hier ist ein Beispiel für eine Indexdeklaration, die die Höhen- und Längenfelder für eine Liste von Dinosauriern indizieren würde:

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

Nächste Schritte