Güvenli olmayan kuralları düzeltme

Cloud Firestore Security RulesYapılandırmalarındaki yaygın güvenlik açıklarını anlamak, kendi kurallarınızı inceleyip daha güvenli hale getirmek ve değişikliklerinizi dağıtmadan önce test etmek için bu kılavuzu kullanın.

Cloud Firestore veritabanınızın düzgün şekilde korunmadığına dair bir uyarı alırsanız Cloud Firestore Security Rules'ınızı değiştirip test ederek güvenlik açıklarını giderebilirsiniz.

Mevcut güvenlik kurallarınızı görüntülemek için Firebase konsolundaki Kurallar sekmesine gidin.

Cloud Firestore Security Rules

Cloud Firestore Security Rules verilerinizi kötü amaçlı kullanıcılara karşı korur. Firebase konsolunda oluşturulan tüm Cloud Firestore örnekleri için varsayılan kurallar, tüm kullanıcıların erişimini reddeder. Uygulamanızı geliştirmek ve veritabanınıza erişmek için bu kuralları değiştirmeniz gerekir. Ayrıca, geliştirme ortamındaki tüm kullanıcılara genel erişim izni verebilirsiniz. Ancak uygulamanızı üretim ortamına dağıtmadan önce kurallarınızı doğru şekilde yapılandırıp verilerinizi güvence altına almak için zaman ayırın.

Uygulamanızı geliştirirken ve kurallarınız için farklı yapılandırmaları test ederken uygulamanızı yerel bir geliştirme ortamında çalıştırmak için Cloud Firestore emülatörünü kullanın.

Güvenli olmayan kurallarla ilgili yaygın senaryolar

Varsayılan olarak veya Cloud Firestore ile uygulamanızı geliştirmeye başladığınızda ayarlamış olabileceğiniz Cloud Firestore Security Rules, uygulamanızı dağıtmadan önce incelenip güncellenmelidir. Aşağıdaki yaygın hatalardan kaçınarak kullanıcılarınızın verilerini gerektiği gibi koruduğunuzdan emin olun.

Açık erişim

Cloud Firestore'ü ayarlarken kurallarınızı geliştirme sırasında açık erişime izin verecek şekilde ayarlamış olabilirsiniz. Uygulamanızı kullanan tek kişinin siz olduğunuzu düşünebilirsiniz ancak uygulamanızı dağıttıysanız internette kullanılabilir. Kullanıcıların kimliğini doğrulamıyor ve güvenlik kurallarını yapılandırmıyorsanız proje kimliğinizi tahmin eden herkes verileri çalabilir, değiştirebilir veya silebilir.

Önerilmez: Tüm kullanıcılara okuma ve yazma erişimi.
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
Çözüm: Okuma ve yazma erişimini kısıtlayan kurallar.

Veri hiyerarşiniz için anlamlı kurallar oluşturun. Bu güvensizliğin yaygın çözümlerinden biri, Firebase Authentication ile kullanıcıya dayalı güvenliktir. Kurallarla kullanıcı kimlik doğrulama hakkında daha fazla bilgi edinin.

Yalnızca içerik sahibi

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      // Allow reads and deletion if the current user owns the existing document
      allow read, delete: if request.auth.uid == resource.data.author_uid;
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;

    }
  }
}
  

Herkese açık ve özel erişim karması

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      // Allow public reads
      allow read: if true
      // Allow creation if the current user owns the new document
      allow create: if request.auth.uid == request.resource.data.author_uid;
      // Allow updates by the owner, and prevent change of ownership
      allow update: if request.auth.uid == request.resource.data.author_uid
                    && request.auth.uid == resource.data.author_uid;
      // Allow deletion if the current user owns the existing document
      allow delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}
  

Kimliği doğrulanmış tüm kullanıcılar için erişim

Bazen Cloud Firestore Security Rules, kullanıcının oturum açtığını kontrol eder ancak bu kimlik doğrulamasına göre erişimi daha fazla kısıtlamaz. Kurallarınızdan biri auth != null içeriyorsa oturum açmış tüm kullanıcıların verilere erişmesini istediğinizi onaylayın.

Önerilmez: Giriş yapan tüm kullanıcılar veritabanınızın tamamına okuma ve yazma erişimine sahiptir.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
Çözüm: Güvenlik koşullarını kullanarak erişimi daraltın.

Kimlik doğrulamayı kontrol ederken, belirli veri kümeleri için belirli kullanıcılara erişimi daha da kısıtlamak amacıyla kimlik doğrulama özelliklerinden birini de kullanabilirsiniz. Güvenlik koşulları ekleme ve rol tabanlı erişim hakkında daha fazla bilgi edinin.

Rol tabanlı erişim

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

Özelliğe dayalı erişim

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

Herkese açık ve özel erişim karması

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Kapalı erişim

Uygulamanızı geliştirirken yaygın olarak kullanılan bir diğer yaklaşım da verilerinizi kilitli tutmaktır. Bu genellikle, tüm kullanıcıların okuma ve yazma erişimini aşağıdaki gibi kapattığınız anlamına gelir:

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Firebase Admin SDK'ları ve Cloud Functions, veritabanınıza erişmeye devam edebilir. Cloud Firestore'ü Firebase Admin SDK ile birlikte yalnızca sunucu arka ucu olarak kullanmak istiyorsanız bu kuralları kullanın. Güvenli olsa da uygulamanızın istemcilerinin verileri doğru şekilde alıp alamadığını test etmeniz gerekir.

Cloud Firestore Security Rules ve işleyiş şekli hakkında daha fazla bilgiyi Cloud Firestore Security Rules'ü kullanmaya başlama başlıklı makalede bulabilirsiniz.

Cloud Firestore Security Rules bildirimlerinizi kontrol edin

Uygulamanızın davranışını kontrol etmek ve Cloud Firestore Security Rules yapılandırmalarınızı doğrulamak için Cloud Firestore emülatörünü kullanın. Herhangi bir değişiklik dağıtmadan önce yerel bir ortamda birim testlerini çalıştırmak ve otomatikleştirmek için Cloud Firestoreemülatörünü kullanın.

Güncellenen Cloud Firestore Security Rules dosyanızı Firebase konsolunda hızlıca test etmek için Kurallar Oyun Alanı aracını kullanın.

  1. Kural oyun alanını açmak için Kurallar sekmesinden Kural oyun alanı'nı tıklayın.
  2. Kurallar oyun alanı ayarlarında, testiniz için aşağıdakiler gibi seçenekleri belirleyin:
    • Okuma veya yazma işlemlerini test etme
    • Veri tabanınızdaki belirli bir konum (yol olarak)
    • Kimlik doğrulama türü: kimliği doğrulanmamış, kimliği doğrulanmış anonim kullanıcı veya belirli bir kullanıcı kimliği
    • Kurallarınızın özellikle referans verdiği belgeye özgü veriler (ör. kurallarınızda yazma işlemine izin vermeden önce belirli bir alanın bulunması gerekiyorsa)
  3. Çalıştır'ı tıklayın ve sonuçları kurallar penceresinin üzerindeki banner'da arayın.