Firebase 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.
Verilerinizin düzgün şekilde korunmadığına dair bir uyarı alırsanız sık yapılan bu hataları inceleyin ve güvenlik açığı olan kuralları güncelleyin.
Firebase Security Rules cihazınıza erişme
Mevcut Rules görüntülemek için Firebase KSA'yı veya Firebase konsolunu kullanın. Güncellemelerin yanlışlıkla üzerine yazılmasını önlemek için kurallarınızı aynı yöntemle ve tutarlı bir şekilde düzenlediğinizden emin olun. Yerel olarak tanımladığınız kuralların en son güncellemeleri yansıtıp yansıtmadığından emin değilseniz Firebase konsolunda her zaman Firebase Security Rules'nızın en son dağıtılan sürümü gösterilir.
Kurallarınıza Firebase konsolundan erişmek için projenizi seçin, ardından Realtime Database, Cloud Firestore veya Storage'a gidin. Doğru veritabanı veya depolama paketi içinde olduğunuzda Kurallar'ı tıklayın.
Kurallarınıza Firebase CLI'dan erişmek için firebase.json dosyanızda belirtilen kurallar dosyasına gidin.
Anlama Firebase Security Rules
Firebase Security Rules verilerinizi kötü amaçlı kullanıcılardan koruyun. Firebase konsolunda bir veritabanı örneği veya Cloud Storage paketi oluşturduğunuzda tüm kullanıcıların erişimini reddetmeyi (Kilitli mod) ya da tüm kullanıcılara erişim izni vermeyi (Test modu) seçebilirsiniz. Geliştirme sırasında daha açık bir yapılandırma isteyebilirsiniz ancak uygulamanızı dağıtmadan önce kurallarınızı doğru şekilde yapılandırmak ve verilerinizi güvenceye almak için zaman ayırdığınızdan emin olun.
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 yerel Firebase emülatörlerinden birini kullanın.
Güvenli olmayan kurallarla ilgili yaygın senaryolar
Varsayılan olarak veya uygulamanızı geliştirme sürecinin başında ayarlamış olabileceğiniz 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
Firebase projenizi 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ılar için okuma ve yazma erişimi.
Cloud Firestore// Allow read/write access to all users under any conditions // Warning: **NEVER** use this ruleset in production; it allows // anyone to overwrite your entire database. service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } } Realtime Database{ // Allow read/write access to all users under any conditions // Warning: **NEVER** use this ruleset in production; it allows // anyone to overwrite your entire database. "rules": { ".read": true, ".write": true } } Cloud Storage// Anyone can read or write to the bucket, even non-users of your app. // Because it is shared with App Engine, this will also make // files uploaded using App Engine public. // Warning: This rule makes every file in your Cloud Storage bucket accessible to any user. // Apply caution before using it in production, since it means anyone // can overwrite all your files. service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write; } } } |
Çö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. Cloud FirestoreRealtime DatabaseCloud Storage |
Kimliği doğrulanmış tüm kullanıcılar için erişim
Bazen 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.
Cloud Firestoreservice cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow read, write: if request.auth.uid != null; } } } Realtime Database{ "rules": { ".read": "auth.uid !== null", ".write": "auth.uid !== null" } } Cloud Storage// Only authenticated users can read or write to the bucket service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { 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. Farklı kimlik doğrulama özellikleri hakkında daha fazla bilgi edinin. Cloud FirestoreRealtime DatabaseCloud Storage |
(Realtime Database) Yanlış devralınan kurallar
Realtime Database Security Rules Daha sığ üst yollardaki kuralların daha derin alt düğümlerdeki kuralları geçersiz kıldığı bir basamaklı yapı. Bir alt düğümde kural yazarken yalnızca ek ayrıcalıklar verebileceğinizi unutmayın. Verilere erişimi hassaslaştıramaz veya veritabanınızdaki daha derin bir yolda iptal edemezsiniz.
Önerilmez: Alt yollardaki kuralları hassaslaştırma
{ "rules": { "foo": { // allows read to /foo/* ".read": "data.child('baz').val() === true", "bar": { /* ignored, since read was allowed already */ ".read": false } } } } |
Çözüm: Üst yollarda geniş kapsamlı kurallar yazın ve alt yollarda daha ayrıntılı ayrıcalıklar verin. Veri erişimi ihtiyaçlarınız daha ayrıntılı olmayı gerektiriyorsa kurallarınızı ayrıntılı tutun. Realtime Database Security Rules temel söz dizimi bölümünde Realtime Database Security Rules basamaklandırma hakkında daha fazla bilgi edinin. |
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.
Cloud Firestore
// Deny read/write access to all users under any conditions service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if false; } } }
Realtime Database
{ "rules": { ".read": false, ".write": false } }
Cloud Storage
// Access to files through Cloud Storage is completely disallowed. // Files may still be accessible through App Engine or Google Cloud Storage APIs. service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write: if false; } } }
Firebase Admin SDK'ları ve Cloud Functions, veritabanınıza erişmeye devam edebilir. Bu kuralları, Firebase Admin SDK ile birlikte yalnızca sunucu tarafında çalışan bir arka uç olarak Cloud Firestore veya Realtime Database kullanmayı planladığınızda uygulayı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 test etme
Uygulamanızın davranışını kontrol etmek ve Cloud Firestore Security Rules yapılandırmalarınızı doğrulamak için Firebase Emulator'ı 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 Firebase Security Rules öğesini hızlıca doğrulamak için Firebase Kuralları Simülatörü'nü kullanın.