Napraw niezabezpieczone zasady

Skorzystaj z tego przewodnika, aby poznać typowe luki w konfiguracjach reguł zabezpieczeń Cloud Firestore, przejrzeć i lepiej zabezpieczyć własne reguły oraz przetestować zmiany przed ich wdrożeniem.

Jeśli otrzymasz alert, że Twoja baza danych Cloud Firestore nie jest odpowiednio zabezpieczona, możesz usunąć luki, modyfikując i testując reguły bezpieczeństwa Cloud Firestore.

Aby wyświetlić istniejące reguły bezpieczeństwa, przejdź do karty Reguły w konsoli Firebase.

Zapoznaj się z zasadami bezpieczeństwa Cloud Firestore

Reguły bezpieczeństwa Cloud Firestore chronią Twoje dane przed złośliwymi użytkownikami. Domyślne reguły dla dowolnej instancji Cloud Firestore utworzonej w konsoli Firebase odmawiają dostępu wszystkim użytkownikom. Aby opracować aplikację i uzyskać dostęp do bazy danych, musisz zmodyfikować te reguły i rozważyć przyznanie ogólnego dostępu wszystkim użytkownikom w środowisku programistycznym. Jednak przed wdrożeniem aplikacji w środowisku produkcyjnym poświęć trochę czasu na prawidłowe skonfigurowanie reguł i zabezpieczenie danych.

Podczas tworzenia aplikacji i testowania różnych konfiguracji reguł użyj emulatora Cloud Firestore , aby uruchomić aplikację w lokalnym środowisku programistycznym.

Typowe scenariusze z niepewnymi regułami

Reguły bezpieczeństwa Cloud Firestore, które mogłeś skonfigurować domyślnie lub podczas początkowej pracy nad tworzeniem aplikacji w Cloud Firestore, powinny zostać sprawdzone i zaktualizowane przed wdrożeniem aplikacji. Upewnij się, że odpowiednio zabezpieczasz dane swoich użytkowników, unikając następujących typowych pułapek.

Otwarty dostęp

Podczas konfigurowania Cloud Firestore mogłeś ustawić reguły zezwalające na otwarty dostęp podczas programowania. Możesz myśleć, że jesteś jedyną osobą korzystającą z Twojej aplikacji, ale jeśli ją wdrożyłeś, jest ona dostępna w Internecie. Jeśli nie uwierzytelniasz użytkowników i nie konfigurujesz reguł bezpieczeństwa, każdy, kto odgadnie Twój identyfikator projektu, będzie mógł ukraść, zmodyfikować lub usunąć dane.

Niezalecane: Dostęp 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 dostęp do odczytu i zapisu.

Twórz reguły, które mają sens dla hierarchii danych. Jednym z typowych rozwiązań tej niepewności są zabezpieczenia oparte na użytkownikach z uwierzytelnianiem Firebase. 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 read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Mieszany dostęp 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 != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Dostęp dla każdego uwierzytelnionego użytkownika

Czasami reguły bezpieczeństwa Cloud Firestore sprawdzają, czy użytkownik jest zalogowany, ale nie ograniczają dalej dostępu w oparciu o to uwierzytelnienie. Jeśli jedna z Twoich reguł zawiera auth != null , potwierdź, że chcesz, aby każdy zalogowany użytkownik miał dostęp do danych.

Niezalecane: każdy zalogowany użytkownik ma dostęp do odczytu i zapisu całej bazy danych.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
Rozwiązanie: Wąski dostęp przy użyciu warunków bezpieczeństwa.

Podczas sprawdzania uwierzytelnienia możesz także użyć jednej z właściwości uwierzytelniania, aby jeszcze bardziej ograniczyć dostęp do określonych użytkowników w przypadku określonych zestawów danych. Dowiedz się więcej o dodawaniu warunków bezpieczeństwa i dostępie opartym na rolach .

Dostęp oparty na rolach

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;
    }
  }
}
  

Mieszany dostęp 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
    }
  }
}
  

Zamknięty dostęp

Innym typowym podejściem podczas tworzenia aplikacji jest blokowanie danych. Zazwyczaj 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 SDK administratora Firebase i funkcje Cloud Functions nadal mają dostęp do Twojej bazy danych. Skorzystaj z tych reguł, jeśli zamierzasz używać Cloud Firestore jako backendu tylko dla serwera w połączeniu z pakietem Firebase Admin SDK. Chociaż jest to bezpieczne, należy sprawdzić, czy klienci aplikacji mogą poprawnie pobierać dane.

Dowiedz się więcej o regułach bezpieczeństwa Cloud Firestore i ich działaniu w artykule Pierwsze kroki z regułami bezpieczeństwa Cloud Firestore .

Sprawdź reguły bezpieczeństwa Cloud Firestore

Aby sprawdzić zachowanie aplikacji i zweryfikować konfiguracje reguł zabezpieczeń Cloud Firestore, użyj emulatora Cloud Firestore . Użyj emulatora Cloud Firestore, aby uruchomić i zautomatyzować testy jednostkowe w środowisku lokalnym przed wdrożeniem jakichkolwiek zmian.

Aby szybko przetestować zaktualizowane reguły bezpieczeństwa Cloud Firestore w konsoli Firebase, użyj narzędzia Rules Playground.

  1. Aby otworzyć Plac zabaw z regułami, kliknij Plac zabaw z regułami na karcie Reguły .
  2. W ustawieniach placu zabaw z regułami wybierz opcje testu, w tym:
    • Testowanie odczytu lub zapisu
    • Konkretna lokalizacja w bazie danych jako ścieżka
    • Typ uwierzytelnienia — nieuwierzytelniony, uwierzytelniony użytkownik anonimowy lub określony identyfikator użytkownika
    • Dane specyficzne dla dokumentu, do których wyraźnie odwołują się Twoje reguły (na przykład, jeśli Twoje reguły wymagają obecności określonego pola przed zezwoleniem na zapis)
  3. Kliknij Uruchom i poszukaj wyników na banerze nad oknem reguł.