Buka konsol

Mempelajari Cara Melindungi File

Cloud Storage menyediakan model keamanan deklaratif berbasis lokasi yang disebut Aturan Keamanan Firebase untuk Cloud Storage, yang bisa Anda gunakan untuk mengamankan file dengan cepat dan mudah.

Memahami Aturan

Aturan Keamanan Firebase untuk Cloud Storage digunakan untuk menentukan siapa saja yang memiliki akses baca dan tulis ke file yang disimpan di Cloud Storage, serta cara penyusunan file dan metadata yang ada di dalamnya. Jenis dasar aturannya adalah allow, yang memungkinkan permintaan read dan write jika ada condition yang ditetapkan secara opsional, misalnya:

// 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>;

Mencocokkan Lokasi

Aturan Keamanan Storage match (mencocokkan) lokasi file yang digunakan untuk mengakses file di Cloud Storage. Aturan dapat match (mencocokkan) lokasi persisnya maupun lokasi karakter pengganti, dan juga dapat dijadikan bertingkat. Jika tidak ada aturan yang cocok yang memungkinkan metode permintaan, atau jika condition bernilai false, maka permintaan akan ditolak.

Kecocokan Persis

// 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>;
}

Kecocokan Bertingkat

// 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>;
  }
}

Kecocokan Karakter Pengganti

Aturan juga dapat digunakan untuk match (mencocokkan) pola dengan karakter pengganti. Karakter pengganti adalah variabel bernama yang mewakili string tunggal, seperti profilePhoto.png, atau multi-segmen, seperti images/profilePhoto.png.

Karakter pengganti dibuat dengan menambahkan tanda kurung kurawal di awal dan akhir nama, misalnya {string}. Karakter pengganti multi-segmen dapat dinyatakan dengan menambahkan =** ke nama, misalnya {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>;
  }
}

Jika beberapa aturan cocok dengan sebuah file, maka hasilnya adalah OR untuk semua evaluasi aturan. Artinya, jika aturan yang cocok dengan file bernilai true, hasilnya adalah true.

Pada aturan di atas, file "images/profilePhoto.png" dapat dibaca jika salah satu dari condition atau other_condition bernilai true, sedangkan file "images/users/user:12345/profilePhoto.png" merupakan satu-satunya subjek dari hasil other_condition.

Variabel karakter pengganti dapat dirujuk dari dalam match yang memberikan nama file atau otorisasi lokasi:

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

Aturan Keamanan Storage tidak menurun dan aturan hanya dievaluasi jika lokasi permintaan cocok dengan lokasi untuk aturan yang ditetapkan.

Evaluasi Permintaan

Upload, download, perubahan metadata, dan penghapusan dievaluasi menggunakan request yang dikirim ke Cloud Storage. Variabel request memuat lokasi file tempat permintaan dijalankan, waktu ketika permintaan diterima, dan nilai resource baru jika permintaan tersebut adalah permintaan tulis. Header HTTP dan status autentikasi juga dicantumkan.

Objek request juga berisi ID unik pengguna dan payload Firebase Authentication dalam objek request.auth, yang akan dijelaskan lebih lanjut di bagian Keamanan Berbasis Pengguna dalam dokumen ini.

Daftar lengkap properti pada objek request tersedia di bawah:

Properti Jenis Deskripsi
auth map<string, string> Saat pengguna login, memasukkan uid, ID unik pengguna, dan token, peta Firebase Authentication JWT diklaim. Untuk kondisi lainnya, nilainya adalah null.
params map<string, string> Peta yang memuat parameter kueri permintaan.
path path path yang mewakili lokasi tempat permintaan dijalankan.
resource map<string, string> Nilai resource baru, hanya ada pada permintaan write.
time timestamp Stempel waktu yang menunjukkan waktu server ketika permintaan dievaluasi.

Evaluasi Resource

Saat mengevaluasi aturan, Anda mungkin juga ingin mengevaluasi metadata dari file yang sedang diupload, didownload, diubah, atau dihapus. Dengan begitu, Anda dapat membuat aturan yang rumit dan kuat untuk melakukan hal spesifik, seperti hanya mengizinkan upload file dengan jenis konten tertentu atau penghapusan file dengan ukuran lebih besar dari ukuran tertentu.

Aturan Keamanan Firebase untuk Cloud Storage menyediakan metadata file di objek resource, yang berisi key-value pair dari metadata yang muncul pada objek Cloud Storage. Properti ini dapat diinspeksi pada permintaan read atau write untuk memastikan keutuhan data.

Pada permintaan write (seperti upload, update metadata, dan penghapusan), selain objek resource yang memuat metadata file untuk file yang sedang berada di lokasi permintaan, Anda juga dapat menggunakan objek request.resource yang memuat subset metadata file yang akan ditulis jika operasi tulis diizinkan. Anda dapat menggunakan kedua nilai tersebut untuk memastikan keutuhan data atau memberlakukan pembatasan aplikasi, seperti jenis atau ukuran file.

Daftar lengkap properti pada objek resource tersedia di bawah:

Properti Jenis Deskripsi
name string Nama lengkap objek
bucket string Nama bucket yang ditempati objek ini.
generation int GCS object generation untuk objek ini.
metageneration int GCS object metageneration untuk objek ini.
size int Ukuran objek, dalam byte.
timeCreated timestamp Stempel waktu yang menunjukkan kapan objek dibuat.
updated timestamp Stempel waktu yang menunjukkan kapan objek terakhir diupdate.
md5Hash string Hash MD5 untuk objek ini.
crc32c string Hash crc32c untuk objek ini.
etag string etag yang terkait dengan objek ini.
contentDisposition string Disposisi konten yang terkait dengan objek ini.
contentEncoding string Encoding konten yang terkait dengan objek ini.
contentLanguage string Bahasa konten yang terkait dengan objek ini.
contentType string Jenis konten yang terkait dengan objek ini.
metadata map<string, string> Key/value pair untuk metadata khusus tambahan yang ditetapkan developer.

request.resource memuat semua properti di atas, kecuali generation, metageneration, etag, timeCreated, dan updated.

Contoh Lengkap

Dengan menggabungkan semuanya, Anda dapat membuat contoh lengkap aturan untuk solusi penyimpanan gambar:

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
     // 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/.*')
                    && request.resource.contentType == resource.contentType
                    && imageId.size() < 32
     }
   }
 }
}

Sekarang, mari kita integrasikan Firebase Authentication untuk akses file terperinci per pengguna di bagian Keamanan Pengguna.