Omówienie reguł bezpieczeństwa bazy danych czasu rzeczywistego Firebase

Reguły zabezpieczeń bazy danych w czasie rzeczywistym Firebase określają, kto ma dostęp do odczytu i zapisu w Twojej bazie danych, jaka jest struktura danych i jakie indeksy istnieją. Reguły te działają na serwerach Firebase i są wymuszane automatycznie przez cały czas. Każde żądanie odczytu i zapisu zostanie zrealizowane tylko wtedy, gdy pozwalają na to Twoje reguły. Domyślnie Twoje reguły nie pozwalają nikomu na dostęp do Twojej bazy danych. Ma to na celu ochronę bazy danych przed nadużyciami, dopóki nie będziesz mieć czasu na dostosowanie reguł lub skonfigurowanie uwierzytelniania.

Reguły bezpieczeństwa baz danych czasu rzeczywistego mają składnię podobną do JavaScriptu i występują w czterech typach:

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

Przegląd bezpieczeństwa bazy danych czasu rzeczywistego

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

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

Uwierzytelnianie

Typowym pierwszym krokiem w zabezpieczaniu aplikacji jest identyfikacja użytkowników. Ten proces nazywa się uwierzytelnianiem . Możesz użyć uwierzytelniania Firebase , aby umożliwić użytkownikom logowanie się w Twojej aplikacji. Uwierzytelnianie Firebase obejmuje obsługę popularnych metod uwierzytelniania, takich jak Google i Facebook, a także logowanie za pomocą poczty e-mail i hasła, logowanie anonimowe i nie tylko.

Tożsamość użytkownika to ważna koncepcja bezpieczeństwa. Różni użytkownicy mają różne dane, a czasami mają różne możliwości. Na przykład w aplikacji 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 czasu rzeczywistego umożliwiają kontrolę dostępu dla każdego użytkownika. Na przykład, oto zestaw reguł bezpieczeństwa, który pozwala każdemu na odczytanie ścieżki /foo/ , ale nikomu nie może do niej pisać:

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

Reguły .read i .read kaskadowo, więc ten .write reguł zapewnia dostęp do odczytu do dowolnych danych w ścieżce /foo/ , a także do głębszych ścieżek, takich jak /foo/bar/baz . Zauważ, że reguły .write .read w bazie danych zastępują głębsze reguły, więc dostęp do odczytu do /foo/bar/baz nadal byłby przyznawany w tym przykładzie, nawet jeśli reguła w ścieżce /foo/bar/baz zostanie oceniona jako fałsz.

Reguły bezpieczeństwa bazy danych czasu rzeczywistego zawierają 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 za pomocą Uwierzytelniania Firebase.

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

Walidacji danych

Baza danych czasu rzeczywistego Firebase jest bez schematu. Ułatwia to wprowadzanie zmian w trakcie opracowywania, ale gdy aplikacja jest gotowa do dystrybucji, ważne jest, aby dane pozostały spójne. Język reguł zawiera regułę .validate , która umożliwia zastosowanie logiki walidacji przy użyciu tych samych wyrażeń, które są używane w regułach .write .read Jedyną różnicą jest to, że reguły walidacji nie są kaskadowe , więc wszystkie odpowiednie reguły walidacji muszą mieć wartość true, aby zapis był dozwolony.

Ta reguła wymusza, aby dane zapisywane do /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 .write .read Możesz ich użyć do tworzenia reguł sprawdzania poprawności, które uwzględniają dane w innym miejscu bazy danych, tożsamość użytkownika, czas serwera i wiele innych.

Definiowanie indeksów bazy danych

Baza danych czasu rzeczywistego Firebase umożliwia porządkowanie i odpytywanie danych. W przypadku małych rozmiarów danych baza danych obsługuje zapytania ad hoc, więc indeksy na ogół nie są wymagane podczas opracowywania. Jednak przed uruchomieniem aplikacji ważne jest, aby określić indeksy dla wszelkich zapytań, które musisz upewnić się, że będą działać w miarę rozwoju aplikacji.

Indeksy są określane za pomocą reguły .indexOn . Oto przykładowa deklaracja indeksu, która indeksuje pola wysokości i długości dla listy dinozaurów:

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

Następne kroki