Unikaj niezabezpieczonych reguł

Z tego przewodnika dowiesz się, jakie są typowe luki w zabezpieczeniach w konfiguracjach Firebase Security Rules, jak sprawdzić i poprawić zabezpieczenia własnych reguł oraz jak przetestować zmiany przed ich wdrożeniem.

Jeśli otrzymasz alert, że Twoje dane nie są odpowiednio zabezpieczone, zapoznaj się z często popełnianymi błędami i zaktualizuj reguły, które są podatne na ataki.

Dostęp do Firebase Security Rules

Aby wyświetlić istniejące Rules, użyj interfejsu wiersza poleceń Firebase lub konsoli Firebase. Aby uniknąć przypadkowego zastąpienia aktualizacji, edytuj reguły, używając tej samej metody. Jeśli nie masz pewności, czy zdefiniowane lokalnie reguły odzwierciedlają najnowsze zmiany, konsola Firebase zawsze wyświetla najnowszą wersję Firebase Security Rules.

Aby uzyskać dostęp do reguł w konsoli Firebase, wybierz swój projekt, a potem przejdź do Realtime Database, Cloud Firestore lub Przechowywanie danych. Gdy znajdziesz się w odpowiedniej bazie danych lub pojemniku magazynu, kliknij Reguły.

Aby uzyskać dostęp do reguł z poziomu wiersza poleceń Firebase, otwórz plik reguł podany w pliku firebase.json.

Firebase Security Rules

Firebase Security Rules chronić dane przed złośliwymi użytkownikami. Podczas tworzenia instancji bazy danych lub zasobnika Cloud Storage w konsoli Firebase możesz odmówić dostępu wszystkim użytkownikom (tryb zablokowany) lub przyznać dostęp wszystkim użytkownikom (tryb testowy). Podczas tworzenia aplikacji możesz chcieć stosować bardziej otwartą konfigurację, ale pamiętaj, aby przed jej wdrożeniem odpowiednio skonfigurować reguły i zabezpieczyć dane.

Podczas tworzenia aplikacji i testowania różnych konfiguracji reguł używaj jednego z lokalnych emulatorów Firebase, aby uruchamiać aplikację w lokalnym środowisku programistycznym.

Typowe scenariusze dotyczące niepewnych reguł

Rules, które zostały skonfigurowane domyślnie lub w trakcie tworzenia aplikacji, należy sprawdzić i zaktualizować przed wdrożeniem aplikacji. Upewnij się, że dane użytkowników są odpowiednio zabezpieczone, unikając tych typowych błędów.

Dostęp otwarty

Podczas konfigurowania projektu Firebase mogłeś/mogłaś ustawić reguły, które zezwalają na otwarty dostęp podczas tworzenia. Możesz sądzić, że jesteś jedyną osobą, która korzysta z Twojej aplikacji, ale jeśli ją wdrożysz, jest ona dostępna w internecie. Jeśli nie uwierzytelniasz użytkowników ani nie konfigurujesz reguł zabezpieczeń, każda osoba, która zgadnie identyfikator Twojego projektu, może wykraść, zmodyfikować lub usunąć dane.

Nie zalecane: dostęp do odczytu i zapisu dla wszystkich użytkowników.

Cloud Firestore

// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this ruleset in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Realtime Database

{
  // Allow read/write access to all users under any conditions
  // Warning: **NEVER** use this ruleset in production; it allows
  // anyone to overwrite your entire database.

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

Cloud Storage

// Anyone can read or write to the bucket, even non-users of your app.
// Because it is shared with App Engine, this will also make
// files uploaded via App Engine public.
// Warning: This rule makes every file in your Cloud Storage bucket accessible to any user.
// Apply caution before using it in production, since it means anyone
// can overwrite all your files.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
    
Rozwiązanie: reguły, które ograniczają dostęp do odczytu i zapisu.

Utwórz reguły, które będą pasować do hierarchii danych. Jednym z najczęstszych rozwiązań tego problemu jest zabezpieczenie oparte na użytkownikach za pomocą Firebase Authentication. Dowiedz się więcej o uwierzytelnianiu użytkowników za pomocą reguł.

Cloud Firestore

Realtime Database

Cloud Storage

Dostęp dla każdego uwierzytelnionego użytkownika

Czasami Rules sprawdza, czy użytkownik jest zalogowany, ale nie ogranicza dostępu na podstawie uwierzytelnienia. Jeśli jedna z reguł zawiera element 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 edycji całej bazy danych.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

Cloud Storage

// Only authenticated users can read or write to the bucket
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      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 różnych właściwościach uwierzytelniania.

Cloud Firestore

Realtime Database

Cloud Storage

(Realtime Database) Nieprawidłowo odziedziczone reguły

Realtime Database Security Rules kaskadowo, przy czym reguły na krótszych ścieżkach nadrzędnych zastępują reguły na dłuższych ścieżkach podrzędnych. Pamiętaj, że reguła w węźle podrzędnym może przyznać tylko dodatkowe uprawnienia. Nie możesz zawęzić ani cofnąć dostępu do danych na niższym poziomie w bazie danych.

Niezalecane: dostosowanie reguł do ścieżek podrzędnych
{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
Rozwiązanie: na ścieżkach nadrzędnych zapisz reguły o szerokim zakresie, a na ścieżkach podrzędnych – bardziej szczegółowe. Jeśli Twoje potrzeby dotyczące dostępu do danych wymagają większej szczegółowości, zachowaj szczegółowość reguł. Dowiedz się więcej o umieszczaniu Realtime Database Security Rules w składni elementu głównego Realtime Database Security Rules.

Dostęp zamknięty

Podczas tworzenia aplikacji możesz też zablokować swoje dane. Zwykle oznacza to, że dostęp do odczytu i edycji został zamknięty dla wszystkich użytkowników w ten sposób:

Cloud Firestore

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Realtime Database

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

Cloud Storage

// Access to files through Cloud Storage is completely disallowed.
// Files may still be accessible through App Engine or Google Cloud Storage APIs.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

Pakiety SDK Firebase Admin i Cloud Functions nadal mają dostęp do Twojej bazy danych. Używaj tych reguł, gdy chcesz używać pakietu Cloud Firestore lub Realtime Database jako backendu tylko na serwerze w połączeniu z pakietem Firebase Admin SDK. Mimo że jest to bezpieczne, sprawdź, czy klienci aplikacji mogą prawidłowo pobierać dane.

Dowiedz się więcej o Cloud Firestore Security Rules i o tym, jak działają te funkcje, w artykule Początkujący: korzystanie z Cloud Firestore Security Rules.

Testowanie Cloud Firestore Security Rules

Aby sprawdzić działanie aplikacji i sprawdzać konfiguracje Cloud Firestore Security Rules, użyj emulatora Firebase. Przed wdrożeniem zmian użyj emulatora Cloud Firestore do uruchamiania i automatyzacji testów jednostkowych w środowisku lokalnym.

Aby szybko zweryfikować Firebase Security Rules w konsoli Firebase, użyj symulatora reguł Firebase.