Cloud Storage dili için Firebase Güvenlik Kuralları'nın temel söz dizimini öğrenin

Firebase Security Rules için Cloud Storage, Cloud Storage paketlerinde depolanan nesnelere erişimi kontrol etmenizi sağlar. Esnek kural söz dizimi, tüm yazma işlemlerinden Cloud Storage paketinize kadar herhangi bir işlemi kontrol etmek için kurallar oluşturmanıza olanak tanır.

Bu kılavuzda, eksiksiz kural kümeleri oluşturmak için Cloud Storage Security Rules'nın temel söz dizimi ve yapısı açıklanmaktadır.

Hizmet ve veritabanı beyanı

Firebase Security Rules için Cloud Storage her zaman aşağıdaki beyanla başlar:

service firebase.storage {
    // ...
}

service firebase.storage bildirimi, kuralların kapsamını Cloud Storage ile sınırlar. Bu sayede, Cloud Storage Security Rules ile Cloud Firestore gibi diğer ürünlere yönelik kurallar arasında çakışma yaşanmaz.

Temel okuma/yazma kuralları

Temel kurallar, Cloud Storage paketlerini tanımlayan bir match ifadesi, bir dosya adını belirten bir eşleşme ifadesi ve belirtilen verilerin okunmasına ne zaman izin verildiğini ayrıntılı olarak açıklayan bir allow ifadesinden oluşur. allow ifadeleri, ilgili erişim yöntemlerini (ör. okuma, yazma) ve erişimin izin verildiği veya reddedildiği koşulları belirtir.

Varsayılan kural kümenizde, ilk match ifadesi, kuralların projenizdeki tüm paketler için geçerli olduğunu belirtmek üzere {bucket} joker karakter ifadesini kullanır. Joker karakter eşleşmeleri konusunu bir sonraki bölümde daha ayrıntılı olarak ele alacağız.

service firebase.storage {
  // The {bucket} wildcard indicates we match files in all Cloud Storage buckets
  match /b/{bucket}/o {
    // Match filename
    match /filename {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

Tüm eşleşme ifadeleri dosyaları gösterir. Bir eşleşme ifadesi, match /images/profilePhoto.png örneğinde olduğu gibi belirli bir dosyayı işaret edebilir.

Joker karakterleri eşleştirme

Rules, tek bir dosyayı işaret etmenin yanı sıra joker karakterler kullanarak adında belirli bir dize öneki bulunan tüm dosyaları (ör. match /images/{imageId}) işaret edebilir.

Yukarıdaki örnekte, eşleşme ifadesinde {imageId} joker karakter söz dizimi kullanılmaktadır. Bu, kuralın adının başında /images/ bulunan tüm dosyalar için geçerli olduğu anlamına gelir. Örneğin, /images/profilePhoto.png veya /images/croppedProfilePhoto.png. Eşleşme ifadesindeki allow ifadeleri değerlendirildiğinde imageId değişkeni, profilePhoto.png veya croppedProfilePhoto.png gibi resim dosyası adına dönüşür.

Dosya adı veya yol yetkilendirmesi sağlamak için match içinden bir joker değişken referans alınabilir:

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

Hiyerarşik veriler

Daha önce de belirttiğimiz gibi, Cloud Storage paketinde hiyerarşik bir yapı yoktur. Ancak dosya adlandırma kuralı kullanarak (genellikle dosya adlarında eğik çizgi içeren bir kural) iç içe geçmiş bir dizi dizin ve alt dizin gibi görünen bir yapı oluşturabiliriz. Firebase Security Rules'nın bu dosya adlarıyla nasıl etkileşim kurduğunu anlamanız önemlidir.

Adlarının tümü /images/ köküyle başlayan bir dosya grubunu ele alalım. Firebase Security Rules yalnızca eşleşen dosya adında geçerli olduğundan /images/ gövdesinde tanımlanan erişim denetimleri /mp3s/ gövdesinde geçerli değildir. Bunun yerine, farklı dosya adı kalıplarıyla eşleşen açık kurallar yazın:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      allow read, write: if <condition>;
    }

    // Explicitly define rules for the 'mp3s' pattern
    match /mp3s/{mp3Id} {
      allow read, write: if <condition>;
    }
  }
}

match ifadeleri iç içe yerleştirildiğinde, içteki match ifadesinin yolu her zaman dıştaki match ifadesinin yoluna eklenir. Bu nedenle, aşağıdaki iki kural grubu eşdeğerdir:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Exact match for "images/profilePhoto.png"
      match /profilePhoto.png {
        allow write: if <condition>;
      }
    }
  }
}
service firebase.storage {
  match /b/{bucket}/o {
    // Exact match for "images/profilePhoto.png"
    match /images/profilePhoto.png {
      allow write: if <condition>;
      }
  }
}

Yinelemeli eşleşme joker karakterleri

Bir dosya adının sonundaki dizeleri eşleştirip döndüren joker karakterlere ek olarak, =** karakterini joker karakter adına ekleyerek (ör. {path=**}) daha karmaşık eşleşmeler için çok segmentli joker karakter tanımlanabilir:

// Partial match for files that start with "images"
match /images {

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

Birden fazla kural bir dosyayla eşleşirse sonuç, tüm kural değerlendirmelerinin OR olur. Yani, dosyanın eşleştiği herhangi bir kural true olarak değerlendirilirse sonuç true olur.

Yukarıdaki kurallarda, condition veya other_condition doğru olarak değerlendirilirse "images/profilePhoto.png" dosyası okunabilir. "images/users/user:12345/profilePhoto.png" dosyası ise yalnızca other_condition sonucuna tabidir.

Cloud Storage Security Rules basamaklı olarak uygulanmaz ve kurallar yalnızca istek yolu, kuralların belirtildiği bir yolla eşleştiğinde değerlendirilir.

Sürüm 1

Firebase Security Rules varsayılan olarak 1. sürümü kullanır. 1. sürümde, yinelemeli joker karakterler sıfır veya daha fazla öğeyle değil, bir veya daha fazla dosya adı öğesiyle eşleşir. Bu nedenle, match /images/{filenamePrefixWildcard}/{imageFilename=**}, /images/profilePics/profile.png gibi bir dosya adıyla eşleşir ancak /images/badge.png ile eşleşmez. Bunun yerine /images/{imagePrefixorFilename=**} kullanın.

Yinelemeli joker karakterler, eşleşme ifadesinin sonunda yer almalıdır.

Daha güçlü özelliklere sahip olduğu için 2. sürümü kullanmanızı öneririz.

Sürüm 2

Firebase Security Rules'nın 2. sürümünde, yinelemeli joker karakterler sıfır veya daha fazla yol öğesiyle eşleşir. Bu nedenle, /images/{filenamePrefixWildcard}/{imageFilename=**}, /images/profilePics/profile.png ve /images/badge.png dosya adlarıyla eşleşir.

Güvenlik kurallarınızın en üstüne rules_version = '2'; ekleyerek 2. sürümü etkinleştirmeniz gerekir:

rules_version = '2';
service cloud.storage {
  match /b/{bucket}/o {
   ...
 }
}

Her eşleşme ifadesinde en fazla bir yinelemeli joker karakter olabilir. Ancak 2. sürümde bu joker karakteri eşleşme ifadesinin herhangi bir yerine yerleştirebilirsiniz. Örneğin:

rules_version = '2';
service firebase.storage {
 match /b/{bucket}/o {
   // Matches any file in a songs "subdirectory" under the
   // top level of your Cloud Storage bucket.
   match /{prefixSegment=**}/songs/{mp3filenames} {
     allow read, write: if <condition>;
   }
  }
}

Ayrıntılı işlemler

Bazı durumlarda, read ve write işlemlerini daha ayrıntılı işlemlere ayırmak faydalı olur. Örneğin, uygulamanız dosya oluşturma ve silme işlemlerinde farklı koşullar uygulamak isteyebilir.

Bir read işlemi get ve list olarak ayrılabilir.

write kuralı create, update ve delete olarak ayrılabilir:

service firebase.storage {
  match /b/{bucket}/o {
    // A read rule can be divided into read and list rules
    match /images/{imageId} {
      // Applies to single file read requests
      allow get: if <condition>;
      // Applies to list and listAll requests (Rules Version 2)
      allow list: if <condition>;

    // A write rule can be divided into create, update, and delete rules
    match /images/{imageId} {
      // Applies to writes to file contents
      allow create: if <condition>;

      // Applies to updates to (pre-existing) file metadata
      allow update: if <condition>;

      // Applies to delete operations
      allow delete: if <condition>;
    }
  }
 }
}

Çakışan eşleşme ifadeleri

Bir dosya adı birden fazla match ifadesiyle eşleşebilir. Birden fazla allow ifadesinin bir istekle eşleştiği durumlarda, koşullardan herhangi biri true ise erişime izin verilir:

service firebase.storage {
  match b/{bucket}/o {
    // Matches file names directly inside of '/images/'.
    match /images/{imageId} {
      allow read, write: if false;
    }

    // Matches file names anywhere under `/images/`
    match /images/{imageId=**} {
      allow read, write: if true;
    }
  }
}

Yukarıdaki örnekte, adları /images/ ile başlayan dosyalara yapılan tüm okuma ve yazma işlemleri, ikinci kural true olduğu için (ilk kural false olsa bile) her zaman izin verilir.

Kurallar filtre değildir

Verilerinizin güvenliğini sağladıktan ve dosya işlemleri yapmaya başladıktan sonra güvenlik kurallarının filtre olmadığını unutmayın. Bir dosya adı kalıbıyla eşleşen bir dosya grubu üzerinde işlem yapamaz ve Cloud Storage'nın yalnızca mevcut istemcinin erişim izni olan dosyalara erişmesini bekleyemezsiniz.

Örneğin, aşağıdaki güvenlik kuralını ele alalım:

service firebase.storage {
  match /b/{bucket}/o {
    // Allow the client to read files with contentType 'image/png'
    match /aFileNamePrefix/{aFileName} {
      allow read: if resource.contentType == 'image/png';
    }
  }
}

Reddedildi: Bu kural, sonuç kümesi contentType değerinin image/png olmadığı dosyaları içerebileceğinden aşağıdaki isteği reddediyor:

Web
filesRef = storage.ref().child("aFilenamePrefix");

filesRef.listAll()
    .then(function(result) {
      console.log("Success: ", result.items);
    })
});

Cloud Storage Security Rules içindeki kurallar, her sorguyu olası sonucuyla karşılaştırır ve istemcinin okuma izni olmayan bir dosyayı döndürebilecekse isteği başarısız kılar. Erişim istekleri, kurallarınız tarafından belirlenen kısıtlamalara uymalıdır.

Sonraki adımlar

Cloud Storage için Firebase Security Rules hakkındaki bilginizi derinleştirebilirsiniz:

  • Kurallar dilinin bir sonraki önemli kavramı olan dinamik koşulları öğrenin. Bu koşullar, kurallarınızın kullanıcı yetkilendirmesini kontrol etmesine, mevcut ve gelen verileri karşılaştırmasına, gelen verileri doğrulamasına ve daha fazlasına olanak tanır.

  • Tipik güvenlik kullanım alanlarını ve Firebase Security Rulesbunları ele alan tanımları inceleyin.

Firebase Security Rules Cloud Storage ile ilgili kullanım alanlarını keşfedebilirsiniz: