Poznaj zasady bezpieczeństwa bazy danych Firebase Realtime

Reguły bezpieczeństwa bazy danych Firebase Realtime określają, kto ma dostęp do odczytu i zapisu w Twojej bazie danych, jaką strukturę mają Twoje dane i jakie istnieją indeksy. Reguły te znajdują się na serwerach Firebase i są zawsze egzekwowane automatycznie. Każde żądanie odczytu i zapisu zostanie zrealizowane tylko wtedy, gdy pozwalają na to Twoje reguły. Domyślnie Twoje reguły nie zezwalają nikomu na dostęp do Twojej bazy danych. Ma to na celu ochronę bazy danych przed nadużyciami do czasu dostosowania reguł lub skonfigurowania uwierzytelniania.

Reguły bezpieczeństwa bazy danych w czasie rzeczywistym mają składnię podobną do JavaScript i występują w czterech typach:

Typy reguł
.Czytać Opisuje, czy i kiedy dane mogą być odczytywane przez użytkowników.
.pisać Opisuje, czy i kiedy można zapisywać dane.
.uprawomocnić Określa, jak będzie wyglądać poprawnie sformatowana wartość, czy ma atrybuty podrzędne i typ danych.
.indeksWł Określa element podrzędny do indeksowania w celu obsługi porządkowania i wykonywania zapytań.

Przegląd bezpieczeństwa bazy danych w czasie rzeczywistym

Baza danych Firebase Realtime zapewnia pełny zestaw narzędzi do zarządzania bezpieczeństwem aplikacji. Narzędzia te ułatwiają uwierzytelnianie użytkowników, egzekwowanie uprawnień użytkowników i sprawdzanie poprawności danych wejściowych.

Aplikacje oparte na Firebase uruchamiają więcej kodu po stronie klienta niż te z wieloma innymi stosami technologii. Dlatego sposób, w jaki podchodzimy do bezpieczeństwa, może być nieco inny niż zwykle.

Uwierzytelnianie

Typowym pierwszym krokiem w zabezpieczeniu aplikacji jest identyfikacja użytkowników. Proces ten nazywany jest uwierzytelnianiem . Możesz użyć uwierzytelniania Firebase , aby użytkownicy mogli logować się do Twojej aplikacji. Uwierzytelnianie Firebase obejmuje obsługę typowych metod uwierzytelniania, takich jak Google i Facebook, a także logowanie za pomocą adresu e-mail i hasła, logowanie anonimowe i nie tylko.

Tożsamość użytkownika jest ważną koncepcją bezpieczeństwa. Różni użytkownicy mają różne dane i czasami mają różne możliwości. Na przykład w aplikacji do czatu każda wiadomość jest powiązana z użytkownikiem, który ją utworzył. Użytkownicy mogą również mieć możliwość usuwania własnych wiadomości, ale nie wiadomości opublikowanych przez innych użytkowników.

Upoważnienie

Identyfikacja użytkownika to tylko część bezpieczeństwa. Gdy już wiesz, kim są, potrzebujesz sposobu na kontrolowanie ich dostępu do danych w Twojej bazie danych. Reguły bezpieczeństwa bazy danych w czasie rzeczywistym pozwalają kontrolować dostęp każdego użytkownika. Na przykład, oto zestaw reguł bezpieczeństwa, który pozwala każdemu odczytać ścieżkę /foo/ , ale nikomu nie wolno na niej pisać:

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

Reguły .read i .write łączą się kaskadowo, więc ten zestaw reguł zapewnia dostęp do odczytu dowolnych danych na ścieżce /foo/ , a także głębszych ścieżkach, takich jak /foo/bar/baz . Należy pamiętać, że płytsze reguły .read i .write w bazie danych zastępują głębsze reguły, więc dostęp do odczytu do /foo/bar/baz nadal będzie przyznany w tym przykładzie, nawet jeśli reguła na ścieżce /foo/bar/baz zostanie oceniona jako fałszywa.

Reguły bezpieczeństwa bazy danych w czasie rzeczywistym obejmują wbudowane zmienne i funkcje, które umożliwiają odwoływanie się do innych ścieżek, znaczników czasu po stronie serwera, informacji uwierzytelniających i nie tylko. Oto przykład reguły, która przyznaje uwierzytelnionym użytkownikom dostęp do zapisu /users/<uid>/ , gdzie <uid> to identyfikator użytkownika uzyskany poprzez uwierzytelnianie Firebase.

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

Walidacji danych

Baza danych czasu rzeczywistego Firebase jest pozbawiona schematu. Ułatwia to wprowadzanie zmian w miarę rozwoju aplikacji, ale gdy aplikacja jest już gotowa do dystrybucji, ważne jest, aby dane pozostały spójne. Język reguł zawiera regułę .validate , która umożliwia zastosowanie logiki sprawdzania poprawności przy użyciu tych samych wyrażeń, które są używane w przypadku reguł .read i .write . Jedyna różnica polega na tym, że reguły sprawdzania poprawności nie działają kaskadowo , więc wszystkie odpowiednie reguły sprawdzania poprawności muszą mieć wartość true, aby zapis był dozwolony.

Reguły te wymuszają, aby dane zapisane w /foo/ musiały być ciągiem krótszym niż 100 znaków:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Reguły walidacji mają dostęp do wszystkich tych samych wbudowanych funkcji i zmiennych, co reguły .read i .write . Można ich używać do tworzenia reguł sprawdzania poprawności uwzględniających dane w innych miejscach bazy danych, tożsamość użytkownika, czas serwera i wiele innych.

Definiowanie indeksów baz danych

Baza danych Firebase Realtime Database umożliwia porządkowanie danych i wysyłanie zapytań. W przypadku małych rozmiarów danych baza danych obsługuje zapytania ad hoc, więc indeksy zazwyczaj nie są wymagane podczas programowania. Jednak przed uruchomieniem aplikacji ważne jest określenie indeksów dla wszelkich zapytań, aby mieć pewność, że będą one nadal działać w miarę rozwoju aplikacji.

Indeksy określa się za pomocą reguły .indexOn . Oto przykładowa deklaracja indeksu, która indeksowałaby pola wysokości i długości listy dinozaurów:

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

Następne kroki