Dowiedz się, jak zabezpieczyć pliki

Cloud Storage for Firebase udostępnia deklaratywny model zabezpieczeń oparty na ścieżce o nazwie Firebase Security Rules dla usługi Cloud Storage, która umożliwia szybkie i łatwe i zabezpieczyć pliki.

Zrozumienie reguł

Firebase Security Rules w domenie Cloud Storage są używane do określania, kto odczytywał i zapisywał dane dostępu do plików przechowywanych w usłudze Cloud Storage oraz sposobu ich przechowywania uporządkowanych i zawartych w nich metadanych. Podstawowym typem reguły jest allow która zezwala na żądania read i write, jeśli zostało określone opcjonalnie określony jest warunek, na przykład:

// If no condition is specified, the rule evaluates to true
allow read;

// Rules can optionally specify a condition
allow write: if <condition>;

// Rules can also specify multiple request methods
allow read, write: if <condition>;

Pasujące ścieżki

Cloud Storage Security Rules match ścieżki do plików używane do uzyskiwania dostępu do plików w Cloud Storage Reguły mogą match ścieżki ścisłe lub ścieżki z symbolami wieloznacznymi. również mogą być zagnieżdżone. Jeśli żadna reguła dopasowania nie zezwala na określoną metodę żądania lub ma wartość false, żądanie jest odrzucane.

Dopasowania ścisłe

// Exact match for "images/profilePhoto.png"
match /images/profilePhoto.png {
  allow write: if <condition>;
}

// Exact match for "images/croppedProfilePhoto.png"
match /images/croppedProfilePhoto.png {
  allow write: if <other_condition>;
}

Zagnieżdżone dopasowania

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/profilePhoto.png"
  match /profilePhoto.png {
    allow write: if <condition>;
  }

  // Exact match for "images/croppedProfilePhoto.png"
  match /croppedProfilePhoto.png {
    allow write: if <other_condition>;
  }
}

Dopasowania symboli wieloznacznych

Reguł można też używać do match wzorca za pomocą symboli wieloznacznych. Symbol wieloznaczny to nazwana zmienna reprezentująca pojedynczy ciąg, taki jak profilePhoto.png lub wiele segmentów ścieżki, np. images/profilePhoto.png

Symbol wieloznaczny tworzy się przez dodanie nawiasów klamrowych wokół nazwy, np. {string} Symbol wieloznaczny dla wielu segmentów można zadeklarować, dodając =** do nazwa symbolu wieloznacznego, np. {path=**}:

// Partial match for files that start with "images"
match /images {
  // Exact match for "images/*"
  // e.g. images/profilePhoto.png is matched
  match /{imageId} {
    // This rule only matches a single path segment (*)
    // imageId is a string that contains the specific segment matched
    allow read: if <condition>;
  }

  // Exact match for "images/**"
  // e.g. images/users/user:12345/profilePhoto.png is matched
  // images/profilePhoto.png is also matched!
  match /{allImages=**} {
    // This rule matches one or more path segments (**)
    // allImages is a path that contains all segments matched
    allow read: if <other_condition>;
  }
}

Jeśli do pliku pasuje wiele reguł, wynik to OR wszystkich reguł weryfikacji reguł. Oznacza to, że jeśli dowolna reguła pasująca do pliku zwraca wartość true, wynik to true.

W regułach powyżej plik „images/profilePhoto.png” można odczytać, jeśli: condition lub other_condition zwracają wartość prawda, a plik „images/users/user:12345/profilePhoto.png” zależy jedynie od wyniku other_condition

Do zmiennej z symbolem wieloznacznym można się odwoływać z pliku udostępniania match autoryzacja nazwy lub ścieżki:

// Another way to restrict the name of a file
match /images/{imageId} {
  allow read: if imageId == "profilePhoto.png";
}

Cloud Storage Security Rules nie są kaskadowe, a reguły są oceniane tylko wtedy, gdy Ścieżka żądania pasuje do ścieżki z określonymi regułami.

Poproś o ocenę

Przesłane, pobrane, zmiany w metadanych i usunięcie są oceniane na podstawie Wysłano request do: Cloud Storage. Zmienna request zawiera ścieżka pliku, w której jest wykonywane żądanie, czas wykonania żądania oraz nową wartość resource, jeśli żądanie dotyczyło zapisu. Nagłówki HTTP i stan uwierzytelniania.

Obiekt request zawiera też unikalny identyfikator użytkownika i obiekt ładunek Firebase Authentication w obiekcie request.auth, który zostanie wyjaśniono dokładniej w sekcji Bezpieczeństwo oparte na użytkownikach sekcji dokumentów.

Pełną listę właściwości obiektu request znajdziesz poniżej:

Właściwość Typ Opis
auth mapa<ciąg, ciąg> Gdy użytkownik jest zalogowany, podaje uid, jego unikalny identyfikator oraz token, mapa deklaracji JWT (Firebase Authentication). W przeciwnym razie zostanie null
params mapa<ciąg, ciąg> Mapa zawierająca parametry zapytania żądania.
path ścieżka path reprezentujący ścieżkę, do której prowadzi żądanie wykonano na
resource mapa<ciąg, ciąg> Nowa wartość zasobu, obecna tylko w żądaniach write.
time sygnatura czasowa Sygnatura czasowa określająca czas oceny żądania przez serwer.

Ocena zasobów

Oceniając reguły, warto też przeanalizować metadane pliku przesyłania, pobierania, modyfikowania lub usuwania. Dzięki temu możesz tworzyć złożone i skuteczne reguły, które zezwalają na używanie tylko plików o określonych parametrach. typów treści, które mają być przesyłane, lub tylko pliki większe niż określony rozmiar Usunięto.

Parametr Firebase Security Rules dla Cloud Storage zawiera metadane pliku w tagu resource który zawiera pary klucz-wartość metadanych wyświetlanych w tagu Cloud Storage obiekt. Te właściwości można sprawdzać w: read lub write żądania, aby zapewnić integralność danych.

W przypadku żądań write (takich jak przesłanie, aktualizacja lub usunięcie metadanych) w oprócz obiektu resource, który zawiera metadane pliku który obecnie znajduje się na ścieżce żądania, możesz również użyć funkcji Obiekt request.resource, który zawiera podzbiór metadanych pliku jeśli dozwolony jest zapis. Korzystając z tych 2 wartości, możesz zapewnić dane integralności lub egzekwować ograniczenia aplikacji, takie jak typ lub rozmiar pliku.

Pełną listę właściwości obiektu resource znajdziesz poniżej:

Właściwość Typ Opis
name ciąg znaków Pełna nazwa obiektu.
bucket ciąg znaków Nazwa zasobnika, w którym znajduje się ten obiekt.
generation int, GCS generowania obiektu.
metageneration int, GCS przez metagenerację tego obiektu.
size int, Rozmiar obiektu w bajtach.
timeCreated sygnatura czasowa Sygnatura czasowa określająca czas utworzenia obiektu.
updated sygnatura czasowa Sygnatura czasowa określająca czas ostatniej aktualizacji obiektu.
md5Hash ciąg znaków Skrót MD5 obiektu.
crc32c ciąg znaków Skrót crc32c obiektu.
etag ciąg znaków ETag powiązany z tym obiektem.
contentDisposition ciąg znaków Dyspozycja treści powiązana z tym obiektem.
contentEncoding ciąg znaków Kodowanie treści powiązane z tym obiektem.
contentLanguage ciąg znaków Język treści powiązany z tym obiektem.
contentType ciąg znaków Typ treści powiązany z tym obiektem.
metadata mapa<ciąg, ciąg> Pary klucz-wartość dodatkowych metadanych niestandardowych określonych przez dewelopera.

request.resource zawiera wszystkie te elementy z wyjątkiem generation, metageneration, etag, timeCreated i updated.

Pełny przykład

Gdy to zrobisz, możesz utworzyć przykłady reguł dla obrazu rozwiązanie do przechowywania danych:

service firebase.storage {
 match /b/{bucket}/o {
   match /images {
     // Cascade read to any image type at any path
     match /{allImages=**} {
       allow read;
     }

     // Allow write files to the path "images/*", subject to the constraints:
     // 1) File is less than 5MB
     // 2) Content type is an image
     // 3) Uploaded content type matches existing content type (if it exists)
     // 4) File name (stored in imageId wildcard variable) is less than 32 characters
     match /{imageId} {
       allow write: if request.resource.size < 5 * 1024 * 1024
                    && request.resource.contentType.matches('image/.*')
                    && (resource == null || request.resource.contentType == resource.contentType)
                    && imageId.size() < 32
     }
   }
 }
}

Zintegrujmy teraz usługę Firebase Authentication, aby umożliwić szczegółowy dostęp do plików dla poszczególnych użytkowników sekcję Bezpieczeństwo użytkowników.