Mit Firebase Realtime Database-Sicherheitsregeln wird festgelegt, 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 Ihre Regeln dies zulassen. Standardmäßig erlauben Ihre Regeln niemandem den Zugriff auf Ihre Datenbank. So wird Ihre Datenbank vor Missbrauch geschützt, bis Sie Zeit haben, Ihre Regeln anzupassen oder die Authentifizierung einzurichten.
Sicherheitsregeln für Realtime Database haben eine JavaScript-ähnliche Syntax und sind in vier Typen verfügbar:
Regeltypen | |
---|---|
.read | Beschreibt, ob und wann Daten von Nutzern gelesen werden dürfen. |
.write | Beschreibt, ob und wann Daten geschrieben werden dürfen. |
.validate | Definiert, wie ein korrekt formatierter Wert aussehen muss, ob er untergeordnete Attribute hat und welchen Datentyp er hat. |
.indexOn | Gibt ein untergeordnetes Element an, das indexiert werden soll, um die Sortierung und Abfrage zu unterstützen. |
Realtime Database – Übersicht über die Sicherheit
Das Firebase Realtime Database bietet eine umfassende Reihe von Tools zum Verwalten der Sicherheit Ihrer App. Mit diesen Tools können Sie Ihre Nutzer ganz einfach authentifizieren, Nutzerberechtigungen erzwingen und Eingaben validieren.
In Firebase-basierten Apps wird mehr clientseitiger Code ausgeführt als in Apps mit vielen anderen Technologie-Stacks. Daher kann sich unser Ansatz in Bezug auf Sicherheit etwas von dem unterscheiden, was Sie gewohnt sind.
Authentifizierung
Ein häufiger erster Schritt beim Sichern Ihrer App ist die Identifizierung Ihrer Nutzer. 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 mit E-Mail-Adresse und Passwort, die anonyme Anmeldung und mehr.
Die Nutzeridentität ist ein wichtiges Sicherheitskonzept. Verschiedene Nutzer haben unterschiedliche Daten und manchmal auch unterschiedliche Funktionen. In einer Chat-Anwendung ist beispielsweise jede Nachricht dem Nutzer zugeordnet, 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 Ihrer Nutzer ist nur ein Teil der Sicherheit. Sobald Sie wissen, wer sie sind, benötigen Sie eine Möglichkeit, den Zugriff auf Daten in Ihrer Datenbank zu steuern. Mit Sicherheitsregeln für Realtime Database können Sie den Zugriff für jeden Nutzer steuern. Hier sehen Sie beispielsweise eine Reihe von Sicherheitsregeln, die es jedem ermöglichen, den Pfad /foo/
zu lesen, aber niemandem, in ihn zu schreiben:
{ "rules": { "foo": { ".read": true, ".write": false } } }
.read
- und .write
-Regeln werden kaskadiert. Dieses Regelset gewährt also Lesezugriff auf alle Daten unter dem Pfad /foo/
sowie auf alle tieferen Pfade wie /foo/bar/baz
. .read
- und .write
-Regeln, die sich weiter oben in der Datenbank befinden, überschreiben Regeln, die sich weiter unten befinden. In diesem Beispiel wird also weiterhin Lesezugriff auf /foo/bar/baz
gewährt, auch wenn eine Regel am Pfad /foo/bar/baz
als „false“ ausgewertet wird.
Die Sicherheitsregeln für die Realtime Database 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 Nutzern Schreibzugriff auf /users/<uid>/
gewährt, wobei <uid> die ID des Nutzers ist, die über Firebase Authentication abgerufen wird.
{ "rules": { "users": { "$uid": { ".write": "$uid === auth.uid" } } } }
Datenvalidierung
Firebase Realtime Database hat kein Schema. So können Sie während der Entwicklung ganz einfach Änderungen vornehmen. Wenn Ihre App jedoch zur Verteilung bereit ist, müssen die Daten konsistent bleiben. Die Regelsprache enthält eine .validate
-Regel, mit der Sie Validierungslogik mit denselben Ausdrücken anwenden können, die für .read
- und .write
-Regeln verwendet werden. Der einzige Unterschied besteht darin, dass Validierungsregeln nicht kaskadiert werden. Damit der Schreibvorgang zulässig ist, müssen also alle relevanten Validierungsregeln als „true“ ausgewertet werden.
Diese Regel erzwingt, 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" } } }
Für Validierungsregeln sind dieselben integrierten Funktionen und Variablen wie für .read
- und .write
-Regeln verfügbar. Damit können Sie Validierungsregeln erstellen, die Daten an anderer Stelle in Ihrer Datenbank, die Identität Ihres Nutzers, die Serverzeit und vieles mehr berücksichtigen.
Datenbankindexe definieren
Mit Firebase Realtime Database können Daten sortiert und abgefragt werden. Bei kleinen Datenmengen unterstützt die Datenbank Ad-hoc-Abfragen, sodass während der Entwicklung in der Regel keine Indexe erforderlich sind. Vor dem Start Ihrer App ist es jedoch wichtig, Indizes für alle Ihre Abfragen anzugeben, damit sie auch bei zunehmender Nutzung Ihrer App weiterhin funktionieren.
Indexe werden mit der Regel .indexOn
angegeben. Hier ist ein Beispiel für eine Indexdeklaration, mit der die Felder „height“ (Höhe) und „length“ (Länge) für eine Liste von Dinosauriern indexiert werden:
{ "rules": { "dinosaurs": { ".indexOn": ["height", "length"] } } }
Nächste Schritte
- Erste Schritte beim Entwickeln von Planungsregeln für Ihre Datenbank.
- Weitere Informationen zum Schützen Ihrer Daten mit Sicherheitsregeln
- Weitere Informationen zum Angeben von Indexen mithilfe von Regeln