Check out what’s new from Firebase at Google I/O 2022. Learn more

Firebase Bulut Depolama Güvenlik Kurallarında kullanım koşulları

Bu kılavuz, Bulut Depolama için Firebase Güvenlik Kurallarınıza nasıl koşul ekleyeceğinizi göstermek için Firebase Güvenlik Kuralları dil kılavuzunun temel sözdizimini öğrenin .

Bulut Depolama Güvenlik Kurallarının birincil yapı taşı koşuldur . Bir koşul, belirli bir işleme izin verilip verilmeyeceğini belirleyen bir boole ifadesidir. Temel kurallar için, true ve false değişmezleri koşul olarak kullanmak kesinlikle iyi sonuç verir. Ancak, Bulut Depolama dili için Firebase Güvenlik Kuralları, size aşağıdakileri yapabilen daha karmaşık koşullar yazmanın yollarını sunar:

  • Kullanıcı kimlik doğrulamasını kontrol edin
  • Gelen verileri doğrula

kimlik doğrulama

Cloud Storage için Firebase Güvenlik Kuralları, Cloud Storage'a güçlü kullanıcı tabanlı kimlik doğrulama sağlamak için Firebase Authentication ile entegre olur. Bu, bir Firebase Kimlik Doğrulama belirtecinin iddialarına dayalı olarak ayrıntılı erişim kontrolüne izin verir.

Kimliği doğrulanmış bir kullanıcı Cloud Storage'a karşı bir istek gerçekleştirdiğinde request.auth değişkeni, kullanıcının kullanıcı uid ( request.auth.uid ) ve ayrıca Firebase Authentication JWT'nin ( request.auth.token ) talepleriyle doldurulur.

Ayrıca, özel kimlik doğrulama kullanılırken request.auth.token alanında ek talepler ortaya çıkar.

Kimliği doğrulanmamış bir kullanıcı bir istek gerçekleştirdiğinde request.auth değişkeni null olur.

Bu verileri kullanarak, dosyaların güvenliğini sağlamak için kimlik doğrulamayı kullanmanın birkaç yaygın yolu vardır:

  • Genel: request.auth yoksay
  • Kimliği doğrulanmış özel: request.auth null olmadığını kontrol edin
  • Kullanıcıya özel: request.auth.uid öğesinin bir yol uid kimliğine eşit olduğunu kontrol edin
  • Özel grup: seçilen bir taleple eşleşmek için özel belirtecin taleplerini kontrol edin veya bir meta veri alanı olup olmadığını görmek için dosya meta verilerini okuyun

Halk

request.auth bağlamını dikkate almayan herhangi bir kural, kullanıcının kimlik doğrulama bağlamını dikkate almadığından public kural olarak kabul edilebilir. Bu kurallar, oyun varlıkları, ses dosyaları veya diğer statik içerik gibi genel verileri ortaya çıkarmak için faydalı olabilir.

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

Kimliği doğrulanmış özel

Bazı durumlarda, verilerin kimliği doğrulanmamış kullanıcılar tarafından değil, uygulamanızın kimliği doğrulanmış tüm kullanıcıları tarafından görüntülenebilir olmasını isteyebilirsiniz. request.auth değişkeni, kimliği doğrulanmamış tüm kullanıcılar için null olduğundan, kimlik doğrulaması gerektirmek için tek yapmanız gereken request.auth değişkeninin var olup olmadığını kontrol etmektir:

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

kullanıcı özel

request.auth için en yaygın kullanım durumu, bireysel kullanıcılara dosyaları üzerinde ayrıntılı izinler sağlamak olacaktır: profil resimleri yüklemekten özel belgeleri okumaya kadar.

Cloud Storage'daki dosyaların dosyaya giden tam bir "yolu" olduğundan, bir dosyayı bir kullanıcı tarafından kontrol etmek için gereken tek şey, dosya adı önekinde (kullanıcının uid gibi) kontrol edilebilen benzersiz, kullanıcıyı tanımlayan bir bilgidir. kural değerlendirildiğinde:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

Grup özel

Eşit derecede yaygın bir başka kullanım durumu, birkaç ekip üyesinin paylaşılan bir belge üzerinde işbirliği yapmasına izin vermek gibi bir nesne üzerinde grup izinlerine izin vermek olacaktır. Bunu yapmak için birkaç yaklaşım vardır:

  • Bir grup üyesi hakkında ek bilgiler (grup kimliği gibi) içeren bir Firebase Authentication özel belirtecini bastırın
  • Dosya meta verilerine grup bilgilerini (bir grup kimliği veya yetkili uid kimlikleri listesi gibi) dahil edin

Bu veriler belirteç veya dosya meta verilerinde depolandıktan sonra, bir kural içinden referans alınabilir:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

Değerlendirme Talebi

Yüklemeler, indirmeler, meta veri değişiklikleri ve silmeler, Cloud Storage'a gönderilen request kullanılarak değerlendirilir. Kullanıcının benzersiz kimliğine ve yukarıda açıklandığı gibi request.auth nesnesindeki Firebase Kimlik Doğrulama yüküne ek olarak, request değişkeni, isteğin gerçekleştirildiği dosya yolunu, isteğin alındığı zamanı ve varsa yeni resource değerini içerir. istek bir yazıdır. HTTP üstbilgileri ve kimlik doğrulama durumu da dahildir.

request nesnesi ayrıca, belgelerin Kullanıcı Tabanlı Güvenlik bölümünde daha ayrıntılı olarak açıklanacak olan request.auth nesnesindeki kullanıcının benzersiz kimliğini ve Firebase Kimlik Doğrulama yükünü içerir.

request nesnesindeki özelliklerin tam listesi aşağıda mevcuttur:

Mülk Tip Açıklama
auth harita<dize, dize> Bir kullanıcı oturum açtığında, uid , kullanıcının benzersiz kimliği ve token , Firebase Authentication JWT taleplerinin bir haritasını sağlar. Aksi takdirde null olacaktır.
params harita<dize, dize> İsteğin sorgu parametrelerini içeren harita.
path yol İsteğin gerçekleştirildiği path temsil eden bir yol.
resource harita<dize, dize> Yalnızca write isteklerinde bulunan yeni kaynak değeri.
time zaman damgası İsteğin değerlendirildiği sunucu saatini temsil eden bir zaman damgası.

Kaynak Değerlendirmesi

Kuralları değerlendirirken, karşıya yüklenen, indirilen, değiştirilen veya silinen dosyanın meta verilerini de değerlendirmek isteyebilirsiniz. Bu, yalnızca belirli içerik türlerine sahip dosyaların yüklenmesine veya yalnızca belirli bir boyuttan büyük dosyaların silinmesine izin vermek gibi şeyler yapan karmaşık ve güçlü kurallar oluşturmanıza olanak tanır.

Cloud Storage için Firebase Güvenlik Kuralları, bir Cloud Storage nesnesinde ortaya çıkan meta verilerin anahtar/değer çiftlerini içeren resource nesnede dosya meta verileri sağlar. Bu özellikler, veri bütünlüğünü sağlamak için read veya write isteklerinde incelenebilir.

write isteklerinde (yüklemeler, meta veri güncellemeleri ve silmeler gibi), istek yolunda şu anda var olan dosya için dosya meta verilerini içeren resource nesnesine ek olarak, request.resource nesnesini de kullanabilirsiniz, bu, yazmaya izin veriliyorsa yazılacak dosya meta verilerinin bir alt kümesini içerir. Veri bütünlüğünü sağlamak veya dosya türü veya boyutu gibi uygulama kısıtlamalarını zorlamak için bu iki değeri kullanabilirsiniz.

resource nesnesindeki özelliklerin tam listesi aşağıda mevcuttur:

Mülk Tip Açıklama
name sicim Nesnenin tam adı
bucket sicim Bu nesnenin bulunduğu paketin adı.
generation int Bu nesnenin Google Cloud Storage nesnesi oluşturma .
metageneration int Bu nesnenin Google Cloud Storage nesnesi meta üretimi .
size int Nesnenin bayt cinsinden boyutu.
timeCreated zaman damgası Bir nesnenin oluşturulduğu zamanı temsil eden bir zaman damgası.
updated zaman damgası Bir nesnenin en son güncellendiği zamanı temsil eden bir zaman damgası.
md5Hash sicim Nesnenin bir MD5 karması.
crc32c sicim Nesnenin bir crc32c karması.
etag sicim Bu nesneyle ilişkili etag.
contentDisposition sicim Bu nesneyle ilişkili içerik düzeni.
contentEncoding sicim Bu nesneyle ilişkili içerik kodlaması.
contentLanguage sicim Bu nesneyle ilişkili içerik dili.
contentType sicim Bu nesneyle ilişkili içerik türü.
metadata harita<dize, dize> Ek, geliştirici tarafından belirtilen özel meta verilerin anahtar/değer çiftleri.

request.resource , oluşturma , etag generation , metageneration , timeCreated ve updated hariç tüm bunları içerir .

Verileri doğrula

Cloud Storage için Firebase Güvenlik Kuralları, dosya adı ve yolunun yanı sıra contentType ve size gibi dosya meta veri özelliklerinin doğrulanması da dahil olmak üzere veri doğrulama için de kullanılabilir.

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

Özel işlevler

Firebase Güvenlik Kurallarınız daha karmaşık hale geldikçe, kural kümenizde yeniden kullanabileceğiniz işlevlerdeki koşul kümelerini sarmak isteyebilirsiniz. Güvenlik kuralları özel işlevleri destekler. Özel işlevlerin sözdizimi biraz JavaScript'e benzer, ancak Firebase Güvenlik Kuralları işlevleri, bazı önemli sınırlamaları olan etki alanına özgü bir dilde yazılmıştır:

  • İşlevler yalnızca tek bir return ifadesi içerebilir. Herhangi bir ek mantık içeremezler. Örneğin, döngü yürütemezler veya harici hizmetleri çağıramazlar.
  • Fonksiyonlar, tanımlandıkları kapsamdaki fonksiyonlara ve değişkenlere otomatik olarak erişebilir. Örneğin, service firebase.storage kapsamında tanımlanan bir işlevin resource değişkenine erişimi vardır ve yalnızca Cloud Firestore için get() ve entity exists() ) gibi yerleşik işlevler.
  • Fonksiyonlar diğer fonksiyonları çağırabilir ancak tekrarlamayabilir. Toplam çağrı yığını derinliği 10 ile sınırlıdır.
  • rules2 sürümünde işlevler, let anahtar sözcüğünü kullanarak değişkenleri tanımlayabilir. İşlevler herhangi bir sayıda let bağlamasına sahip olabilir, ancak bir return ifadesi ile bitmelidir.

Bir işlev, function anahtar sözcüğüyle tanımlanır ve sıfır veya daha fazla argüman alır. Örneğin, yukarıdaki örneklerde kullanılan iki tür koşulu tek bir işlevde birleştirmek isteyebilirsiniz:

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

Firebase Güvenlik Kurallarınızdaki işlevleri kullanmak, kurallarınızın karmaşıklığı arttıkça onları daha sürdürülebilir hale getirir.

Sonraki adımlar

Koşullarla ilgili bu tartışmadan sonra, daha gelişmiş bir Kural anlayışına sahip olursunuz ve şunları yapmaya hazırsınız:

Temel kullanım senaryolarının nasıl ele alınacağını öğrenin ve Kuralları geliştirmek, test etmek ve dağıtmak için iş akışını öğrenin: