Firebase 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.
Verilerinizin yeterince güvenli olmadığı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'inizi 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öntemi kullanarak tutarlı bir şekilde düzenlediğinizden emin olun. Yerel olarak tanımlanan kurallarınızın en son güncellemeleri yansıtıp yansıtmadığından emin değilseniz Firebase konsolu her zaman Firebase Security Rules'ün en son dağıtılan sürümünü gösterir.
Firebase konsolundan kurallarınıza erişmek için projenizi seçin, ardından Realtime Database, Cloud Firestore veya Storage'a gidin. Doğru veritabanına veya depolama alanına ulaştıktan sonra Kurallar'ı tıklayın.
Kurallarınıza Firebase CLI'den erişmek için firebase.json dosyanızda belirtilen kurallar dosyasına gidin.
Firebase Security Rules hakkında bilgi edinme
Firebase Security Rules verilerinizi kötü amaçlı kullanıcılara karşı korur. Firebase konsolunda bir veritabanı örneği veya Cloud Storage paketi oluşturduğunuzda tüm kullanıcılara erişimi reddedebilir (Kilitli mod) ya da tüm kullanıcılara erişim izni verebilirsiniz (Test modu). 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ırdığınızdan ve verilerinizi güvence altına aldığı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ştirmeye başladığınızda ayarlamış olabileceğiniz 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
Firebase projenizi ayarlarken kurallarınızı geliştirme sırasında herkese 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ılar için okuma ve yazma erişimi.
// 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; } } } { // 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 } } // 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ğ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 sahibiservice 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; } } } Karma herkese açık ve gizli erişimservice 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; } } } Yalnızca içerik sahibi{ "rules": { "some_path": { "$uid": { // Allow only authenticated content owners access to their data ".read": "auth !== null && auth.uid === $uid", ".write": "auth !== null && auth.uid === $uid" } } } } Karma herkese açık ve gizli erişim{ // Allow anyone to read data, but only authenticated content owners can // make changes to their data "rules": { "some_path/$uid": { ".read": true, // or ".read": "auth.uid !== null" for only authenticated users ".write": "auth.uid === $uid" } } } Yalnızca içerik sahibi// Grants a user access to a node matching their user ID service firebase.storage { match /b/{bucket}/o { // Files look like: "user/<UID>/file.txt" match /user/{userId}/{fileName} { allow read, write: if request.auth.uid == userId; } } } Karma herkese açık ve gizli erişimservice firebase.storage { match /b/{bucket}/o { // Files look like: "user/<UID>/file.txt" match /user/{userId}/{fileName} { allow read; allow write: if request.auth.uid == userId; } } } |
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ğrulamasına dayalı olarak 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.uid != null; } } } { "rules": { ".read": "auth.uid !== null", ".write": "auth.uid !== null" } } // 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 amacıyla kimlik doğrulama özelliklerinden birini de kullanabilirsiniz. Farklı kimlik doğrulama özellikleri hakkında daha fazla bilgi edinin. Rol tabanlı erişimservice 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 get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader" allow write: if 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. } } } Özellik tabanlı 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 "administrator" attribute set // to "true" grants write access to data service cloud.firestore { match /databases/{database}/documents { match /some_collection/{document} { allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true; allow read: true; } } } Karma herkese açık ve gizli erişimservice 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 } } } Yalnızca içerik sahibi{ "rules": { "some_path": { "$uid": { // Allow only authenticated content owners access to their data ".read": "auth.uid === $uid", ".write": "auth.uid === $uid" } } } } Yolla tanımlanan erişim{ "rules": { "some_path/$uid": { ".write": "auth.uid === $uid", // Create a "public" subpath in your dataset "public": { ".read": true // or ".read": "auth.uid !== null" }, // Create a "private" subpath in your dataset "private": { ".read": "auth.uid === $uid" } } } } Karma herkese açık ve gizli erişim{ // Allow anyone to read data, but only authenticated content owners can // make changes to their data "rules": { "some_path/$uid": { ".read": true, // or ".read": "auth.uid !== null" for only authenticated users ".write": "auth.uid === $uid" } } } Grup tabanlı erişim// Allow reads if the group ID in your token matches the file metadata `owner` property // Allow writes if the group ID is in the user's custom token match /files/{groupId}/{fileName} { allow read: if resource.metadata.owner == request.auth.token.groupId; allow write: if request.auth.token.groupId == groupId; } Yalnızca içerik sahibi// Grants a user access to a node matching their user ID service firebase.storage { match /b/{bucket}/o { // Files look like: "user/<UID>/file.txt" match /user/{userId}/{fileName} { allow read, write: if request.auth.uid == userId; } } } Karma herkese açık ve gizli erişimservice firebase.storage { match /b/{bucket}/o { // Files look like: "user/<UID>/file.txt" match /user/{userId}/{fileName} { allow read; allow write: if request.auth.uid == userId; } } } |
(Realtime Database) Yanlış devralınan kurallar
Realtime Database Security Rules basamaklı, daha sığ ebeveyn yollarındaki kuralların daha derin alt düğümlerdeki kuralları geçersiz kılması. Bir alt düğümde kural yazarken bu kuralın yalnızca ek ayrıcalıklar verebileceğini unutmayın. Veritabanınıza daha derin bir yoldan erişen kullanıcıların erişimini hassaslaştıramaz veya iptal edemezsiniz.
Önerilmez: Alt yollarda 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 spesifik ayrıcalıklar verin. Veri erişimi ihtiyaçlarınız daha ayrıntılı bir düzey gerektiriyorsa kurallarınızı ayrıntılı tutun. Realtime Database Security Rules'nin temel söz diziminde Realtime Database Security Rules'yi 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 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; } } }
{ "rules": { ".read": false, ".write": false } }
// 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. Firebase Admin SDK ile birlikte yalnızca sunucu arka ucu olarak Cloud Firestore veya Realtime Database 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
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şiklik dağıtmadan önce yerel bir ortamda birim testlerini çalıştırmak ve otomatikleştirmek için Cloud Firestoreemülatörünü kullanın.
Firebase konsolunda Firebase Security Rules'ü hızlıca doğrulamak için Firebase Kural Simülasyon Aracı'nı kullanın.