Omówienie reguł zabezpieczeń Bazy danych czasu rzeczywistego Firebase

Reguły zabezpieczeń Bazy danych czasu rzeczywistego Firebase określają, kto ma dostęp do odczytu i zapisu w Twojej bazie danych, jak są ustrukturyzowane dane i jakie indeksy istnieją. Te reguły znajdują się na serwerach Firebase i są automatycznie egzekwowane przez cały czas. Każde żądanie odczytu i zapisu zostanie zrealizowane tylko wtedy, gdy zezwalają na to Twoje reguły. Domyślnie Twoje reguły nie zezwalają nikomu na dostęp do Twojej bazy danych. Służy to ochronie bazy danych przed nadużyciami, dopóki nie będziesz mieć czasu na dostosowanie reguł lub skonfigurowanie uwierzytelniania.

Reguły zabezpieczeń Bazy danych czasu rzeczywistego mają składnię podobną do JavaScript i występują w 4 typach:

Typy reguł
.read Określa, czy i kiedy użytkownicy mogą odczytywać dane.
.write Określa, czy i kiedy można zapisywać dane.
.validate Określa, jak będzie wyglądać poprawnie sformatowana wartość, czy ma atrybuty podrzędne i jaki jest typ danych.
.indexOn Określa element podrzędny, który ma być indeksowany, aby obsługiwać sortowanie i wysyłanie zapytań.

Realtime Database omówienie bezpieczeństwa

Narzędzie Firebase Realtime Database udostępnia pełny zestaw narzędzi do zarządzania bezpieczeństwem aplikacji. Ułatwiają one uwierzytelnianie użytkowników, egzekwowanie uprawnień użytkowników i sprawdzanie poprawności danych wejściowych.

Aplikacje oparte na Firebase działają po stronie klienta w większym stopniu niż aplikacje korzystające z wielu innych stosów technologii. Dlatego nasze podejście do bezpieczeństwa może się nieco różnić od tego, do czego jesteś przyzwyczajony.

Uwierzytelnianie

Pierwszym krokiem w zabezpieczaniu aplikacji jest identyfikacja użytkowników. Ten proces nazywa się uwierzytelnianiem. Za pomocą usługi Uwierzytelnianie Firebase możesz umożliwić użytkownikom logowanie się w aplikacji. Usługa Uwierzytłenianie Firebase obejmuje obsługę popularnych metod uwierzytelniania, takich jak Google i Facebook, a także logowanie się za pomocą adresu e-mail i hasła, logowanie anonimowe i inne.

Tożsamość użytkownika jest ważnym pojęciem związanym z bezpieczeństwem. Różni użytkownicy mają różne dane, a czasami różne możliwości. Na przykład w aplikacji do czatowania każda wiadomość jest powiązana z użytkownikiem, który ją utworzył. Użytkownicy mogą też usuwać własne wiadomości, ale nie wiadomości opublikowane przez innych użytkowników.

Autoryzacja

Identyfikacja użytkownika to tylko część zabezpieczeń. Gdy już wiesz, kim jest użytkownik, musisz mieć możliwość kontrolowania jego dostępu do danych w bazie danych. Reguły zabezpieczeń Bazy danych czasu rzeczywistego umożliwiają kontrolowanie dostępu każdego użytkownika. Oto na przykład zestaw reguł zabezpieczeń, które umożliwiają każdemu odczytywanie ścieżki /foo/, ale nikomu nie pozwalają na zapisywanie w niej:

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

Reguły .read i .write są kaskadowe, więc ten zestaw reguł przyznaje dostęp do odczytu wszystkich danych w ścieżce /foo/, a także w ścieżkach głębszych, takich jak /foo/bar/baz. Pamiętaj, że reguły .read i .write znajdujące się na płytszym poziomie w bazie danych zastępują reguły znajdujące się na głębszym poziomie, więc w tym przykładzie dostęp do odczytu ścieżki /foo/bar/baz będzie nadal przyznawany, nawet jeśli reguła w ścieżce /foo/bar/baz zwróci wartość false.

Reguły zabezpieczeń Bazy danych czasu rzeczywistego obejmują wbudowane zmienne i funkcje, które umożliwiają odwoływanie się do innych ścieżek, sygnatur czasowych po stronie serwera, informacji o uwierzytelnianiu, i innych. Oto przykład reguły, która przyznaje dostęp do zapisu dla uwierzytelnionych użytkowników w ścieżce /users/<uid>/, gdzie <uid> to identyfikator użytkownika uzyskany za pomocą usługi Firebase Authentication.

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

Walidacja danych

Firebase Realtime Database nie ma schematu. Ułatwia to wprowadzanie zmian podczas tworzenia aplikacji, ale gdy aplikacja jest gotowa do dystrybucji, ważne jest, aby dane były spójne. Język reguł obejmuje regułę .validate, która umożliwia stosowanie logiki sprawdzania poprawności za pomocą tych samych wyrażeń, które są używane w regułach .read i .write. Jedyna różnica polega na tym, że reguły sprawdzania poprawności nie są kaskadowe, więc aby zezwolić na zapis, wszystkie odpowiednie reguły sprawdzania poprawności muszą zwracać wartość true.

Te reguły wymuszają, aby dane zapisywane w ścieżce /foo/ były ciągiem znaków o długości mniejszej niż 100 znaków:

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

Reguły sprawdzania poprawności mają dostęp do wszystkich tych samych wbudowanych funkcji i zmiennych co reguły .read i .write. Możesz ich używać do tworzenia reguł sprawdzania poprawności, które uwzględniają dane z innych miejsc w bazie danych, tożsamość użytkownika, czas serwera i wiele innych.

Definiowanie indeksów bazy danych

Firebase Realtime Database umożliwia sortowanie danych i wysyłanie zapytań. W przypadku małych zbiorów danych baza danych obsługuje szybkie zapytania, więc indeksy nie są zwykle wymagane podczas tworzenia aplikacji. Zanim jednak opublikujesz aplikację, musisz określić indeksy dla wszystkich zapytań, aby mieć pewność, że będą one nadal działać wraz z rozwojem aplikacji.

Indeksy są określane za pomocą reguły .indexOn. Oto przykład deklaracji indeksu, która indeksuje pola height i length dla listy dinozaurów:

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

Dalsze kroki