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

Cloud Storage için Firebase Security Rules, Cloud Storage paketlerinde depolanan nesnelere erişimi kontrol etmenizi sağlar. Esnek kurallar söz dizimi, Cloud Storagepaketinize yapılan tüm yazma işlemlerinden belirli bir dosyadaki işlemlere kadar her türlü işlemi kontrol edecek kurallar oluşturmanıza olanak tanır.

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

Hizmet ve veritabanı beyanı

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

service firebase.storage {
    // ...
}

service firebase.storage beyanı, kuralları Cloud Storage olarak tanımlar. Böylece Cloud Storage Security Rules ile Cloud Firestore gibi diğer ürünlere ait kurallar arasında çakışmalar önlenir.

Temel okuma/yazma kuralları

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

Varsayılan kural grubunuzdaki ilk match ifadesi, kuralların projenizdeki tüm paketlere uygulanacağını belirtmek için {bucket} joker karakter ifadesini kullanır. Joker karakter eşleşmeleri fikrini 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ı işaret eder. Eşleşme ifadesi, match /images/profilePhoto.png'te olduğu gibi belirli bir dosyayı işaret edebilir.

Eşleştirme joker karakterleri

Rules, tek bir dosyayı işaretlemenin yanı sıra match /images/{imageId}'taki gibi adında belirli bir dize ön ekiyle (eğik çizgiler dahil) başlayan tüm dosyaları işaretlemek için joker karakterler kullanabilir.

Yukarıdaki örnekte, eşleme ifadesi {imageId} joker karakter söz dizimini kullanır. Bu, kuralın adının başında /images/ olan tüm dosyalar (ör. /images/profilePhoto.png veya /images/croppedProfilePhoto.png) için geçerli olduğu anlamına gelir. Eşleşme ifadesindeki allow ifadeleri değerlendirildiğinde, imageId değişkeni resim dosya adına çözümlenir (ör. profilePhoto.png veya croppedProfilePhoto.png).

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

// 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 paketinin içinde hiyerarşik bir yapı yoktur. Ancak, çoğu zaman dosya adlarında eğik çizgi içeren bir dosya adlandırma kuralı kullanarak iç içe yerleştirilmiş bir dizi dizin ve alt dizin gibi görünen bir yapıyı taklit edebiliriz. Firebase Security Rules'ün bu dosya adlarıyla nasıl etkileşime geçtiğini anlamanız önemlidir.

Adlarının tümü /images/ kökü ile başlayan bir dosya grubunu ele alalım. Firebase Security Rules yalnızca eşleşen dosya adında uygulanır. Bu nedenle, /images/ kökünde tanımlanan erişim denetimleri /mp3s/ kökü için 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ştirilirken iç match ifadesinin yolu her zaman dış match ifadesinin yoluna eklenir. Bu nedenle aşağıdaki iki kural kümesi 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

Dosya adının sonundaki dizelerle eşleşen ve döndüren joker karakterlere ek olarak, joker karakter adına =** ekleyerek daha karmaşık eşleşmeler için {path=**} gibi bir çoklu segment joker karakteri 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 sonucunun OR'sidir. Yani, dosyanın eşleştiği 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 basamaklandırılmaz ve kurallar yalnızca istek yolu, belirtilen kurallara sahip bir yola eşleştiğinde değerlendirilir.

Sürüm 1

Firebase Security Rules varsayılan olarak sürüm 1'i kullanır. 1. sürümde, yinelenen joker karakterler sıfır veya daha fazla öğe 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şirken /images/badge.png ile eşleşmez. Bunun yerine /images/{imagePrefixorFilename=**} kullanın.

Yinelenen joker karakterler, bir eşleşme ifadesinin sonunda gelmelidir.

Daha güçlü özellikleri için 2. sürümü kullanmanızı öneririz.

Sürüm 2

Firebase Security Rules'ün 2. sürümünde, yinelenen 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 {
   ...
 }
}

Eşleşme ifadesi başına en fazla bir yinelenen joker karakteriniz 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şlevlerinin daha ayrıntılı işlemlere ayrılması yararlı olur. Örneğin, uygulamanız dosya oluşturma işlemi için dosya silme işleminden farklı koşullar uygulamak isteyebilir.

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

write kuralı create, update ve delete'e bölünebilir:

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 birinin true olması durumunda 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, ilk kural false olsa bile ikinci kural her zaman true olduğu için adı /images/ ile başlayan dosyalara yapılan tüm okuma ve yazma işlemlerine 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. Dosya adı kalıbıyla eşleşen bir dosya grubu üzerinde işlem gerçekleştiremezsiniz ve Cloud Storage ürününün yalnızca geçerli istemcinin erişim iznine sahip olduğu dosyalara erişmesini bekleyebilirsiniz.

Ö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: Sonuç kümesi, contentType değerinin image/png olmadığı dosyaları içerebileceği için bu kural aşağıdaki isteği reddeder:

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

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

Cloud Storage Security Rules politikasındaki kurallar, her bir sorguyu potansiyel sonucuna göre değerlendirir ve istemcinin okuma izninin olmadığı bir dosyayı döndürmesi durumunda isteği gerçekleştiremez. 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ında daha fazla bilgi edinebilirsiniz:

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

  • Güvenlikle ilgili tipik kullanım alanlarını ve bunları ele alan Firebase Security Rules tanımlarını inceleyin.

Cloud Storage'a özgü Firebase Security Rules kullanım alanını keşfedebilirsiniz: