Mempelajari cara mengamankan file

Cloud Storage for Firebase menyediakan model keamanan deklaratif berbasis jalur 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 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

Aturan Keamanan Cloud Storage 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";
}

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

Evaluasi Permintaan

Upload, download, perubahan metadata, dan penghapusan dievaluasi menggunakan request yang 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.

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 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 kita integrasikan Firebase Authentication untuk akses file terperinci per pengguna di bagian Keamanan Pengguna.