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

Reguły bezpieczeństwa bazy danych czasu rzeczywistego Firebase określają, kto ma dostęp do odczytu i zapisu w Twojej bazie danych, jaka jest struktura danych i jakie istnieją indeksy. Reguły te działają na serwerach Firebase i są automatycznie wymuszane przez cały czas. Każde żądanie odczytu i zapisu zostanie zrealizowane tylko wtedy, gdy pozwolą 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 czasu rzeczywistego mają składnię podobną do języka 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 dane mogą być zapisywane.
.uprawomocnić Definiuje, jak będzie wyglądać prawidłowo sformatowana wartość, czy ma atrybuty podrzędne i typ danych.
.indeks Wł Określa element podrzędny do indeksowania w celu obsługi porządkowania i wykonywania zapytań.

Omówienie bezpieczeństwa bazy danych czasu rzeczywistego

Baza danych czasu rzeczywistego Firebase zapewnia pełny zestaw narzędzi do zarządzania bezpieczeństwem Twojej aplikacji. Te narzędzia ułatwiają uwierzytelnianie użytkowników, wymuszanie 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ż to, do czego 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ę do Twojej aplikacji. Uwierzytelnianie Firebase obejmuje wbudowaną obsługę popularnych metod uwierzytelniania, takich jak Google i Facebook, a także logowanie za pomocą poczty e-mail i hasła, anonimowe logowanie i nie tylko.

Tożsamość użytkownika jest ważną koncepcją 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 kontrolowania ich dostępu do danych w Twojej bazie danych. Reguły bezpieczeństwa bazy danych w czasie rzeczywistym pozwalają kontrolować dostęp dla każdego użytkownika. Na przykład, oto zestaw reguł bezpieczeństwa, który pozwala każdemu odczytać ścieżkę /foo/ , ale nikt nie może do niej pisać:

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

Kaskada reguł .read i .write , więc ten zestaw reguł zapewnia dostęp do odczytu do dowolnych danych w ścieżce /foo/ , jak również wszelkich głębszych ścieżkach, takich jak /foo/bar/baz . Zauważ, że reguły .read i .write płytsze w bazie danych zastępują reguły głębsze, więc dostęp do odczytu do /foo/bar/baz nadal byłby przyznany w tym przykładzie, nawet jeśli reguła w ścieżce /foo/bar/baz ma wartość false.

Reguły bezpieczeństwa bazy danych czasu rzeczywistego 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 uprawnienia do zapisu uwierzytelnionym użytkownikom do /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 pozbawiona schematów. Ułatwia to wprowadzanie zmian w miarę rozwoju, 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 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 są kaskadowane , więc wszystkie odpowiednie reguły sprawdzania poprawności muszą mieć wartość true, aby zapis był dozwolony.

Ta reguła wymusza, aby dane zapisywane do /foo/ były łańcuchem krótszym 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żyć do tworzenia reguł sprawdzania poprawności, które są świadome danych w innych miejscach w bazie danych, tożsamości użytkownika, czasu serwera i wielu innych.

Definiowanie indeksów baz danych

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

Indeksy są określane przy użyciu reguły .indexOn . Oto przykładowa deklaracja indeksu, która indeksowałaby pola wysokości i długości dla listy dinozaurów:

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

Następne kroki