Z tego przewodnika dowiesz się, jakie są typowe luki w zabezpieczeniach Cloud Firestore Security Ruleskonfiguracji. Pozwoli Ci to sprawdzić i lepiej zabezpieczyć własne reguły oraz przetestować zmiany przed ich wdrożeniem.
Jeśli otrzymasz alert, że baza danych Cloud Firestore nie jest odpowiednio zabezpieczona, możesz usunąć luki w zabezpieczeniach, modyfikując i testując Cloud Firestore Security Rules.
Aby wyświetlić istniejące reguły zabezpieczeń, otwórz kartę Reguły w Firebase konsoli.
Poznaj swoje urządzenie Cloud Firestore Security Rules
Cloud Firestore Security Rules chronić dane przed złośliwymi użytkownikami; Domyślne reguły dla każdego wystąpienia Cloud Firestore utworzonego w konsoli Firebase odmawiają dostępu wszystkim użytkownikom. Aby opracować aplikację i uzyskać dostęp do bazy danych, musisz zmodyfikować te reguły. Możesz też rozważyć przyznanie wszystkim użytkownikom w środowisku programistycznym nieograniczonego dostępu. Zanim jednak wdrożysz aplikację w środowisku produkcyjnym, poświęć czas na prawidłowe skonfigurowanie reguł i zabezpieczenie danych.
Podczas tworzenia aplikacji i testowania różnych konfiguracji reguł używaj Cloud Firestoreemulatora, aby uruchamiać aplikację w lokalnym środowisku programistycznym.
Typowe scenariusze z niebezpiecznymi regułami
Cloud Firestore Security Rules, które mogły zostać skonfigurowane domyślnie lub podczas początkowych prac nad aplikacją z użyciem Cloud Firestore, należy sprawdzić i zaktualizować przed wdrożeniem aplikacji. Zadbaj o odpowiednie zabezpieczenie danych użytkowników, unikając tych typowych błędów.
Otwarty dostęp
Podczas konfigurowania Cloud Firestore mogłeś(-aś) ustawić reguły tak, aby zezwalały na otwarty dostęp podczas programowania. Może Ci się wydawać, że tylko Ty korzystasz z aplikacji, ale jeśli została ona wdrożona, jest dostępna w internecie. Jeśli nie uwierzytelniasz użytkowników i nie konfigurujesz reguł zabezpieczeń, każdy, kto odgadnie identyfikator Twojego projektu, może wykradać, modyfikować lub usuwać dane.
Nie zalecane: uprawnienia do odczytu i zapisu dla wszystkich użytkowników. |
// Allow read/write access to all users under any conditions // Warning: **NEVER** use this rule set in production; it allows // anyone to overwrite your entire database. service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
Rozwiązanie: reguły ograniczające uprawnienia do odczytu i zapisu.
Twórz reguły, które pasują do hierarchii danych. Jednym z popularnych rozwiązań tego problemu jest zabezpieczenie oparte na użytkownikach z Firebase Authentication. Dowiedz się więcej o uwierzytelnianiu użytkowników za pomocą reguł. |
Tylko właściciel treści
service cloud.firestore { match /databases/{database}/documents { // Allow only authenticated content owners access match /some_collection/{document} { // Allow reads and deletion if the current user owns the existing document allow read, delete: if request.auth.uid == resource.data.author_uid; // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == resource.data.author_uid; } } }
Dostęp mieszany (publiczny i prywatny)
service cloud.firestore { match /databases/{database}/documents { // Allow public read access, but only content owners can write match /some_collection/{document} { // Allow public reads allow read: if true // Allow creation if the current user owns the new document allow create: if request.auth.uid == request.resource.data.author_uid; // Allow updates by the owner, and prevent change of ownership allow update: if request.auth.uid == request.resource.data.author_uid && request.auth.uid == resource.data.author_uid; // Allow deletion if the current user owns the existing document allow delete: if request.auth.uid == resource.data.author_uid; } } }
Dostęp dla każdego uwierzytelnionego użytkownika
Czasami Cloud Firestore Security Rules sprawdzają, czy użytkownik jest zalogowany, ale nie ograniczają dostępu na podstawie uwierzytelniania. Jeśli jedna z Twoich reguł zawiera
auth != null
, potwierdź, że chcesz, aby każdy zalogowany użytkownik miał dostęp do danych.
Nie zalecane: każdy zalogowany użytkownik ma dostęp do odczytu i zapisu w całej bazie danych. |
service cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, write: if request.auth != null; } } }
Rozwiązanie: ogranicz dostęp za pomocą warunków bezpieczeństwa.
Podczas sprawdzania uwierzytelniania możesz też użyć jednej z właściwości uwierzytelniania, aby dodatkowo ograniczyć dostęp do określonych zbiorów danych dla konkretnych użytkowników. Dowiedz się więcej o dodawaniu warunków bezpieczeństwa i dostępie na podstawie roli. |
Dostęp na podstawie roli
service cloud.firestore { match /databases/{database}/documents { // Assign roles to all users and refine access based on user roles match /some_collection/{document} { allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader" allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer" // Note: Checking for roles in your database using `get` (as in the code // above) or `exists` carry standard charges for read operations. } } }
Dostęp oparty na atrybutach
// Give each user in your database a particular attribute // and set it to true/false // Then, use that attribute to grant access to subsets of data // For example, an "admin" attribute set // to "true" grants write access to data service cloud.firestore { match /databases/{database}/documents { match /collection/{document} { allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true; allow read: true; } } }
Dostęp mieszany (publiczny i prywatny)
service cloud.firestore { match /databases/{database}/documents { // Allow public read access, but only content owners can write match /some_collection/{document} { allow read: if true allow write: if request.auth.uid == request.resource.data.author_uid } } }
Dostęp dla niezweryfikowanych adresów e-mail
Czasami Cloud Firestore Security Rules sprawdź, czy adres e-mail użytkownika należy do określonej domeny. Chociaż jest to ogólnie dobra praktyka, adresy e-mail nie zawsze są weryfikowane podczas logowania, dopóki użytkownik nie wykona dodatkowego kroku po otrzymaniu e-maila weryfikacyjnego. Upewnij się, że sprawdzasz, czy adres e-mail należy do użytkownika.
Nie zalecane: każdy użytkownik może zalogować się za pomocą dowolnego adresu e-mail. |
service cloud.firestore { match /databases/{database}/documents { // Allow access based on email domain match /some_collection/{document} { allow read: if request.auth != null && request.auth.email.endsWith('@example.com') } } }
Rozwiązanie: ogranicz dostęp tylko do zweryfikowanych adresów e-mail. |
Weryfikowanie adresów e-mail
service cloud.firestore { match /databases/{database}/documents { // Allow access based on email domain match /some_collection/{document} { allow read: if request.auth != null && request.auth.email_verified && request.auth.email.endsWith('@example.com') } } }
Dostęp zamknięty
Podczas tworzenia aplikacji często stosuje się też inne podejście, które polega na zabezpieczeniu danych. Zwykle oznacza to, że dostęp do odczytu i zapisu został zamknięty dla wszystkich użytkowników w następujący sposób:
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Pakiety Firebase Admin SDK i Cloud Functions nadal mogą uzyskiwać dostęp do Twojej bazy danych. Używaj tych reguł, gdy chcesz używać Cloud Firestore jako backendu tylko na serwerze w połączeniu z pakietem Firebase Admin SDK. Chociaż jest bezpieczne, warto sprawdzić, czy klienci aplikacji mogą prawidłowo pobierać dane.
Dowiedz się więcej o Cloud Firestore Security Rules i o tym, jak działają w pierwszych krokach z Cloud Firestore Security Rules.
Sprawdź aplikację Cloud Firestore Security Rules
Aby sprawdzić działanie aplikacji i zweryfikować konfiguracje Cloud Firestore Security Rules, użyj Cloud Firestore emulatora. Użyj Cloud Firestoreemulatora, aby uruchamiać i automatyzować testy jednostkowe w środowisku lokalnym przed wdrożeniem jakichkolwiek zmian.
Aby szybko przetestować zaktualizowane Cloud Firestore Security Rules w konsoli Firebase, użyj narzędzia Plac zabaw reguł.
- Aby otworzyć środowisko do testowania reguł, na karcie Reguły kliknij Środowisko do testowania reguł.
- W ustawieniach Placu zabaw dla reguł wybierz opcje testu, w tym:
- Testowanie odczytów i zapisów
- określone miejsce w bazie danych jako ścieżkę;
- Typ uwierzytelniania – nieuwierzytelniony, uwierzytelniony anonimowy użytkownik lub konkretny identyfikator użytkownika.
- dane specyficzne dla dokumentu, do których odwołują się reguły (np. jeśli reguły wymagają obecności określonego pola przed zezwoleniem na zapis);
- Kliknij Wykonaj i sprawdź wyniki na banerze nad oknem reguł.