Güvenli olmayan kuralları düzeltme

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

Cloud Firestore veritabanınızın düzgün şekilde güvenli hale getirilmediğine dair bir uyarı alırsanız Cloud Firestore Security Rules öğenizi değiştirip test ederek güvenlik açıklarını giderebilirsiniz.

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

Cloud Firestore Security Rules anlayın

Cloud Firestore Security Rules verilerinizi kötü amaçlı kullanıcılardan koruyun. Firebase konsolunda oluşturulan tüm Cloud Firestore örneklerinin varsayılan kuralları, tüm kullanıcıların erişimini engeller. 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 vermeyi düşünebilirsiniz. Ancak uygulamanızı üretim ortamına dağıtmadan önce kurallarınızı düzgün şekilde yapılandırmak ve verilerinizi güvenli hale getirmek 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 başlangıçta Cloud Firestore ile uygulamanızı geliştirirken ayarlamış olabileceğiniz Cloud Firestore Security Rules, uygulamanızı dağıtmadan önce incelenmeli ve güncellenmelidir. Aşağıdaki yaygın hatalardan kaçınarak kullanıcılarınızın verilerini uygun şekilde koruduğunuzdan emin olun.

Açık erişim

Cloud Firestore'yı ayarlarken kurallarınızı geliştirme sırasında açık erişime izin verecek şekilde ayarlamış olabilirsiniz. Uygulamanızı yalnızca sizin kullandığınızı düşünebilirsiniz ancak 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ğe karşı yaygın çözümlerden biri, Firebase Authentication ile kullanıcı tabanlı güvenliktir. Kullanıcıları kurallarla 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şimin karıştırılması

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ğrulamaya göre erişimi daha fazla kısıtlamaz. Kurallarınızdan biri auth != null içeriyorsa oturum açmış herhangi bir kullanıcının verilere erişmesini istediğinizi onaylayın.

Önerilmez: Giriş yapan herhangi bir kullanıcı, 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 üzere 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şimin karıştırılması

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

Doğrulanmamış e-posta adresleri için erişim

Bazen Cloud Firestore Security Rules kullanıcının e-postasının belirli bir alana ait olup olmadığını kontrol edin. Bu genellikle iyi bir uygulama olsa da, doğrulama e-postası alındıktan sonra kullanıcı tarafından ek bir adım gerçekleştirilene kadar e-postalar oturum açma sırasında her zaman doğrulanmaz. E-postanın gerçekten kullanıcıya ait olduğunu doğruladığınızdan emin olun.

Önerilmez: Herhangi bir kullanıcı rastgele bir e-posta adresiyle oturum açabilir.
service cloud.firestore {
  match /databases/{database}/documents {
    // Allow access based on email domain
    match /some_collection/{document} {
     allow read: if request.auth != null
                 && request.auth.email.endsWith('@example.com')
    }
  }
}
Çözüm: Erişimi yalnızca doğrulanmış e-postalarla sınırlandırın.

E-postaları doğrulama

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow access based on email domain
    match /some_collection/{document} {
     allow read: if request.auth != null
                 && request.auth.email_verified
                 && request.auth.email.endsWith('@example.com')
    }
  }
}

Kapalı erişim

Uygulamanızı geliştirirken yaygın olarak kullanılan bir diğer yaklaşım da verilerinizi kilitli tutmaktır. Bu durum genellikle tüm kullanıcılara okuma ve yazma erişimini 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'yı Firebase Admin SDK ile birlikte yalnızca sunucu tarafında çalışan bir arka uç olarak kullanmayı planladığınızda bu kuralları kullanın. Güvenli olsa da uygulamanızın istemcilerinin verileri düzgün şekilde alıp alamadığını test etmeniz gerekir.

Cloud Firestore Security Rules ve bunların işleyiş şekli hakkında daha fazla bilgiyi Cloud Firestore Security Rules ile Başlarken 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şikliği dağıtmadan önce yerel bir ortamda birim testlerini çalıştırmak ve otomatikleştirmek için Cloud Firestore emülatörünü kullanın.

Firebase konsolunda güncellenmiş Cloud Firestore Security Rules öğenizi hızlıca test etmek için kurallar deneme alanı aracını kullanın.

  1. Kural oyun alanını açmak için Kurallar sekmesinde Kural oyun alanı'nı tıklayın.
  2. Kurallar deneme alanı ayarlarında, testiniz için seçenekleri belirleyin. Örneğin:
    • Okuma veya yazma işlemlerini test etme
    • Veritabanı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ız, yazma işlemine izin vermeden önce belirli bir alanın bulunmasını gerektiriyorsa)
  3. Çalıştır'ı tıklayın ve sonuçları kurallar penceresinin üstündeki banner'da bulun.