Cloud Firestore Güvenlik Kurallarını Yapılandırma

Cloud Firestore Security Rules, veritabanınızdaki dokümanlara ve koleksiyonlara erişimi kontrol etmenize olanak tanır. Esnek kural söz dizimi, tüm veritabanına yapılan yazma işlemlerinden belirli bir dokümandaki işlemlere kadar her şeyle eşleşen kurallar oluşturmanıza olanak tanır.

Bu kılavuzda, güvenlik kurallarının temel söz dizimi ve yapısı açıklanmaktadır. Eksiksiz kural kümeleri oluşturmak için bu söz dizimini güvenlik kuralları koşullarıyla birleştirin.

Yapay zeka desteği için aşağıdaki istemi yapay zeka kodlama temsilcinize (ör. Android Studio'da Gemini, Antigravity, Claude Code, Codex ve Cursor) kopyalayın. İstemi özelleştirebilir ve temsilcinizle birlikte üzerinde çalışabilirsiniz. Ayrıntılı kurulum bilgileri için Firebase aracı becerileri sayfasını ziyaret edin.

Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me write, validate, and deploy Firebase Security Rules to protect my app's Firestore data.

Hizmet ve veritabanı beyanı

Cloud Firestore Security Rules her zaman aşağıdaki beyanla başlar:

service cloud.firestore {
  // The {database} wildcard allows the rules to reference any database,
  // but these rules are only active on databases where they are explicitly deployed.
  match /databases/{database}/documents {
    // ...
  }
}

service cloud.firestore bildirimi, kuralları Rules kapsamına alarak Cloud Firestore Security Rules ile Cloud Storage gibi diğer ürünlerin kuralları arasında çakışma olmasını önler.

match /databases/{database}/documents beyanı, kuralların projedeki herhangi bir kural veritabanıyla eşleşmesi gerektiğini belirtir. Bir proje en fazla 100 veritabanı içerebilir ancak yalnızca oluşturulan ilk veritabanı varsayılan olarak belirlenir.

Cloud Firestore Security Rules, projenizdeki her adlandırılmış veritabanı için ayrı ayrı uygulanır. Bu nedenle, birden fazla veritabanı oluşturursanız her biri için kuralları ayrı ayrı yönetmeniz ve dağıtmanız gerekir. Güncellemelerinizi dağıtmayla ilgili ayrıntılı talimatlar için Güncellemelerinizi dağıtma başlıklı makaleyi inceleyin.

Temel okuma/yazma kuralları

Temel kurallar, bir doküman yolunu belirten match ifadesinden ve belirtilen verilerin okunmasına ne zaman izin verildiğini ayrıntılı olarak açıklayan allow ifadesinden oluşur:

service cloud.firestore {
  match /databases/{database}/documents {

    // Match any document in the 'cities' collection
    match /cities/{city} {
      allow read: if <condition>;
      allow write: if <condition>;
    }
  }
}

Tüm eşleşme ifadeleri koleksiyonlara değil, belgelere işaret etmelidir. Bir eşleşme ifadesi, match /cities/SF örneğinde olduğu gibi belirli bir dokümana işaret edebilir veya match /cities/{city} örneğinde olduğu gibi belirtilen yoldaki herhangi bir dokümana işaret etmek için joker karakterler kullanabilir.

Yukarıdaki örnekte, eşleşme ifadesi {city} joker karakter söz dizimini kullanır. Bu, kuralın cities koleksiyonundaki tüm belgeler (ör. /cities/SF veya /cities/NYC) için geçerli olduğu anlamına gelir. Eşleştirme ifadesindeki allow ifadeleri değerlendirildiğinde city değişkeni, SF veya NYC gibi şehir dokümanı adını alır.

Ayrıntılı işlemler

Bazı durumlarda, read ve write işlemlerini daha ayrıntılı işlemlere bölmek faydalı olabilir. Örneğin, uygulamanız doküman oluşturma ve doküman silme işlemleri için farklı koşullar uygulamak isteyebilir. Tek bir dokümanın okunmasına izin verip büyük sorguları reddetmek isteyebilirsiniz.

read kuralı get ve list olarak ayrılabilirken write kuralı create, update ve delete olarak ayrılabilir:

service cloud.firestore {
  match /databases/{database}/documents {
    // A read rule can be divided into get and list rules

    match /cities/{city} {
      // Applies to single document read requests
      allow get: if <condition>;

      // Applies to queries and collection read requests
      allow list: if <condition>;
    }
    // A write rule can be divided into create, update, and delete rules
    match /cities/{city} {
      // Applies to writes to nonexistent documents
      allow create: if <condition>;

      // Applies to writes to existing documents
      allow update: if <condition>;

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

Hiyerarşik veriler

Kurallar'daki veriler, belge koleksiyonları halinde düzenlenir ve her belge, hiyerarşiyi alt koleksiyonlar aracılığıyla genişletebilir. Güvenlik kurallarının hiyerarşik verilerle nasıl etkileşime girdiğini anlamak önemlidir.

cities koleksiyonundaki her belgenin bir landmarks alt koleksiyonu içerdiği durumu düşünün. Güvenlik kuralları yalnızca eşleşen yolda geçerlidir. Bu nedenle, cities koleksiyonunda tanımlanan erişim denetimleri landmarks alt koleksiyonu için geçerli değildir. Bunun yerine, alt koleksiyonlara erişimi kontrol etmek için açık kurallar yazın:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      allow read, write: if <condition>;

        // Explicitly define rules for the 'landmarks' subcollection
        match /landmarks/{landmark} {
          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 göredir. Bu nedenle, aşağıdaki kural kümeleri eşdeğerdir:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      match /landmarks/{landmark} {
        allow read, write: if <condition>;
      }
    }
  }
}
service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city}/landmarks/{landmark} {
      allow read, write: if <condition>;
    }
  }
}

Yinelemeli joker karakterler

Kuralların rastgele derinlikteki bir hiyerarşiye uygulanmasını istiyorsanız yinelemeli joker karakter söz dizimini ({name=**}) kullanın. Örneğin:

service cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the cities collection as well as any document
    // in a subcollection.
    match /cities/{document=**} {
      allow read, write: if <condition>;
    }
  }
}

Yinelemeli joker karakter söz dizimi kullanılırken joker karakter değişkeni, doküman derin iç içe yerleştirilmiş bir alt koleksiyonda bulunsa bile eşleşen yol segmentinin tamamını içerir. Örneğin, yukarıda listelenen kurallar /cities/SF/landmarks/coit_tower konumundaki bir dokümanla eşleşir ve document değişkeninin değeri SF/landmarks/coit_tower olur.

Ancak özyinelemeli joker karakterlerin davranışının kural sürümüne bağlı olduğunu unutmayın.

Sürüm 1

Güvenlik kuralları varsayılan olarak 1. sürümü kullanır. 1. sürümde, yinelemeli joker karakterler bir veya daha fazla yol öğesiyle eşleşir. Boş bir yolla eşleşmezler. Bu nedenle match /cities/{city}/{document=**}, alt koleksiyonlardaki belgelerle eşleşir ancak cities koleksiyonundaki belgelerle eşleşmez. match /cities/{document=**} ise hem cities koleksiyonundaki hem de alt koleksiyonlardaki belgelerle eşleşir.

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

Sürüm 2

Güvenlik kurallarının 2. sürümünde, yinelemeli joker karakterler sıfır veya daha fazla yol öğesiyle eşleşir. match/cities/{city}/{document=**}, cities koleksiyonundaki dokümanların yanı sıra alt koleksiyonlardaki dokümanlarla da 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.firestore {
 match /databases/{database}/documents {
   // Matches any document in the cities collection as well as any document
   // in a subcollection.
   match /cities/{city}/{document=**} {
     allow read, write: if <condition>;
   }
 }
}

Eşleşme ifadesi başına en fazla bir özyinelemeli joker karakter kullanabilirsiniz ancak 2. sürümde bu joker karakteri eşleşme ifadesinin herhangi bir yerine yerleştirebilirsiniz. Örneğin:

rules_version = '2';
service cloud.firestore {
 match /databases/{database}/documents {
   // Matches any document in the songs collection group
   match /{path=**}/songs/{song} {
     allow read, write: if <condition>;
   }
 }
}

Koleksiyon grubu sorguları kullanıyorsanız 2. sürümü kullanmanız gerekir. Koleksiyon grubu sorgularının güvenliğini sağlama başlıklı makaleyi inceleyin.

Çakışan eşleşme ifadeleri

Bir doküman 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 cloud.firestore {
  match /databases/{database}/documents {
    // Matches any document in the 'cities' collection.
    match /cities/{city} {
      allow read, write: if false;
    }

    // Matches any document in the 'cities' collection or subcollections.
    match /cities/{document=**} {
      allow read, write: if true;
    }
  }
}

Yukarıdaki örnekte, ilk kural her zaman false olsa da ikinci kural her zaman true olduğu için cities koleksiyonuna yönelik tüm okuma ve yazma işlemlerine izin verilir.

Güvenlik kuralı sınırları

Güvenlik kurallarıyla çalışırken aşağıdaki sınırlara dikkat edin:

Sınır Ayrıntılar
İstek başına maksimum exists(), get() ve getAfter() çağrısı sayısı
  • Tek belgeli istekler ve sorgu istekleri için 10.
  • Çok belgeli okumalar, işlemler ve toplu yazmalar için 20. Her işlemde yukarıdaki 10 sınırı da geçerlidir.

    3 yazma işlemiyle bir toplu yazma isteği oluşturduğunuzu ve güvenlik kurallarınızın her yazma işlemini doğrulamak için 2 belge erişimi çağrısı kullandığını varsayalım. Bu durumda her yazma işlemi 10 erişim çağrısından 2'sini; toplu yazma isteği ise 20 erişim çağrısından 6'sını kullanır.

Her iki sınırın da aşılması, "izin verilmedi" hatasıyla sonuçlanır.

Bazı belge erişimi çağrıları önbelleğe alınabilir. Önbelleğe alınan çağrılar sınırlamaya dahil edilmez.

Maksimum iç içe yerleştirilen match ifadesi derinliği 10
Yol segmentlerinde, iç içe yerleştirilmiş bir grup match ifadesinde izin verilen maksimum yol uzunluğu 100
İç içe yerleştirilen bir grup match ifadesinde izin verilen maksimum yol yakalama değişkeni sayısı 20
Maksimum işlev çağrısı derinliği 20
Maksimum işlev bağımsız değişkeni sayısı 7
İşlev başına maksimum let işlev bağlama sayısı 10
Maksimum yinelenen veya döngüsel işlev çağrısı sayısı 0 &lpar;izin verilmez&rpar;
İstek başına değerlendirilen maksimum ifade sayısı 1.000
Maksimum kural grubu boyutu Kural kümeleri iki boyut sınırına uymalıdır:
  • Firebase konsolundan veya CLI'dan firebase deploy kullanılarak yayınlanan kural grubu metin kaynağının boyutu için 256 KB sınırı
  • Firebase, kaynağı işleyip arka uçta etkin hale getirdiğinde ortaya çıkan derlenmiş kural kümesinin boyutu için 250 KB'lık bir sınır vardır.

Sonraki adımlar