Mempelajari cara mengamankan file

Cloud Storage for Firebase menyediakan model keamanan deklaratif berbasis jalur yang disebut Firebase Security Rules untuk Cloud Storage, yang bisa Anda gunakan untuk mengamankan file dengan cepat dan mudah.

Memahami Aturan

Firebase Security Rules untuk Cloud Storage digunakan untuk menentukan siapa saja yang memiliki akses baca dan tulis ke file yang disimpan di Cloud Storage, serta bagaimana file disusun dan metadata apa yang dikandungnya. Jenis aturan dasarnya adalah aturan allow, yang memungkinkan permintaan read dan write jika kondisi yang ditentukan secara opsional ditetapkan, 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 Jalur

Cloud Storage Security Rules match dengan jalur file yang digunakan untuk mengakses file di Cloud Storage. Aturan dapat match dengan jalur persisnya atau jalur karakter pengganti, dan aturan juga dapat dijadikan bertingkat. Jika tidak ada aturan match yang mengizinkan metode permintaan, atau jika kondisi bernilai false, 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 pola menggunakan karakter pengganti. Karakter pengganti adalah variabel bernama yang mewakili string tunggal, seperti profilePhoto.png, atau beberapa segmen jalur, seperti images/profilePhoto.png.

Karakter pengganti dibuat dengan menambahkan tanda kurung kurawal di awal dan akhir nama karakter pengganti, misalnya {string}. Karakter pengganti beberapa segmen dapat dideklarasikan dengan menambahkan =** ke nama karakter pengganti, seperti {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, hasilnya adalah OR dari hasil 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 benar, sedangkan file "images/users/user:12345/profilePhoto.png" hanya bergantung pada hasil other_condition.

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

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

Cloud Storage Security Rules tidak menurun, dan aturan hanya dievaluasi jika jalur permintaan cocok dengan jalur dengan aturan yang ditentukan.

Evaluasi Permintaan

Upload, download, perubahan metadata, dan penghapusan dievaluasi menggunakan request dikirim ke Cloud Storage. Variabel request berisi jalur file tempat permintaan dijalankan, waktu 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 di objek request.auth yang akan dijelaskan lebih lanjut di bagian Keamanan Berbasis Pengguna dalam dokumentasi.

Daftar lengkap properti di objek request tersedia di bawah:

Properti Jenis Deskripsi
auth map<string, string> Saat pengguna login, memberikan uid, ID unik pengguna, dan token, peta klaim JWT Firebase Authentication. Jika pengguna tidak login, nilainya adalah null.
params map<string, string> Peta yang memuat parameter kueri permintaan.
path jalur path yang mewakili jalur 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 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.

Firebase Security Rules untuk Cloud Storage memberikan 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 integritas data.

Pada permintaan write (seperti upload, pembaruan metadata, dan penghapusan), selain objek resource, yang berisi metadata file untuk file yang saat ini ada di jalur permintaan, Anda juga dapat menggunakan objek request.resource, yang berisi subset metadata file yang akan ditulis jika operasi tulis diizinkan. Anda dapat menggunakan kedua nilai tersebut untuk memastikan integritas data atau memberlakukan pembatasan aplikasi, seperti jenis atau ukuran file.

Daftar lengkap properti di 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 diperbarui.
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 kustom tambahan yang ditetapkan developer.

request.resource berisi 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 (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
     }
   }
 }
}

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