Temel Güvenlik Kuralları

Firebase Security Rules, depolanan verilerinize erişimi kontrol etmenize olanak tanır. Esnek kurallar söz dizimi, veritabanının tamamına yapılan tüm yazma işlemlerinden belirli bir belgedeki işlemlere kadar her şeyle eşleşen kurallar oluşturabileceğiniz anlamına gelir.

Bu kılavuzda, uygulamanızı oluşturup verilerinizi korurken uygulamak isteyebileceğiniz daha temel kullanım alanlarından bazıları açıklanmaktadır. Ancak kural yazmaya başlamadan önce, kuralların yazıldığı dil ve davranışları hakkında daha fazla bilgi edinebilirsiniz.

Kurallarınıza erişmek ve bunları güncellemek için Firebase Security Rules'ü yönetme ve dağıtma başlıklı makalede açıklanan adımları uygulayın.

Varsayılan kurallar: Kilitli mod

Firebase konsolunda bir veritabanı veya depolama örneği oluşturduğunuzda, Firebase Security Rules'ın verilerinize erişimi kısıtlamasını (Kilitli mod) veya herkese erişim izni vermesini (Test modu) seçersiniz. Cloud Firestore ve Realtime Database'te Kilitli mod için varsayılan kurallar tüm kullanıcıların erişimini reddeder. Cloud Storage'te yalnızca kimliği doğrulanmış kullanıcılar depolama alanı paketlerine erişebilir.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Geliştirme ortamı kuralları

Uygulamanız üzerinde çalışırken verilerinize nispeten açık veya sınırsız erişim isteyebilirsiniz. Uygulamanızı üretime dağıtmadan önce Rules dosyanızı güncellemeniz yeterlidir. Ayrıca, uygulamanızı dağıtırsanız yayınlamasanız bile herkese açık olacağını unutmayın.

Firebase'in, müşterilerin verilerinize doğrudan erişmesine izin verdiğini ve Firebase Security Rules, kötü amaçlı kullanıcıların erişimini engelleyen tek koruma yöntemi olduğunu unutmayın. Kuralları ürün mantığından ayrı olarak tanımlamanın birçok avantajı vardır: Müşteriler güvenliğin uygulanmasından sorumlu değildir, hatalı uygulamalar verilerinizi tehlikeye atmaz ve en önemlisi, verileri dünya genelinden korumak için bir aracı sunucuya güvenmezsiniz.

Tüm kimliği doğrulanmış kullanıcılar

Verilerinizin, oturum açmış olan tüm kullanıcılar tarafından erişilebilir durumda bırakılmasını önermesek de uygulamanızı geliştirirken kimliği doğrulanmış tüm kullanıcılara erişim izni vermeniz yararlı olabilir.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}

Üretime hazır kurallar

Uygulamanızı dağıtmaya hazırlanırken verilerinizin korunduğundan ve kullanıcılarınıza uygun şekilde erişim izni verildiğinden emin olun. Kullanıcı tabanlı erişim ayarlamak için Authentication'ten yararlanın ve veri tabanlı erişimi ayarlamak için doğrudan veritabanınızdan okuma yapın.

Kurallarınızı oluşturma şekliniz, farklı yollardaki verilere erişimi nasıl kısıtladığınızı etkilediğinden, verilerinizi yapılandırırken kurallar yazmayı düşünün.

Yalnızca içerik sahibi erişimi

Bu kurallar, erişimi yalnızca içeriğin kimliği doğrulanmış sahibiyle sınırlandırır. Veriler yalnızca tek bir kullanıcı tarafından okunabilir ve yazılabilir. Veri yolu ise kullanıcının kimliğini içerir.

Bu kuralın işe yaradığı durumlar: Bu kural, veriler kullanıcıya göre silolara ayrılmışsa (verilere erişmesi gereken tek kullanıcı, verileri oluşturan kullanıcıysa) iyi çalışır.

Bu kuralın çalışmadığı durumlar: Bu kural kümesi, birden fazla kullanıcının aynı verileri yazması veya okuması gerektiğinde çalışmaz. Kullanıcılar verilerin üzerine yazar veya oluşturdukları verilere erişemez.

Bu kuralı ayarlamak için: Verileri okumak veya yazmak için erişim isteyen kullanıcının, söz konusu verilerin sahibi olduğunu doğrulayan bir kural oluşturun.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{userId}/{documents=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId
    }
  }
}

Realtime Database

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

Cloud Storage

// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Karma herkese açık ve gizli erişim

Bu kural, herkesin veri kümesini okumasına izin verir ancak belirli bir yolda veri oluşturma veya değiştirme yetkisini yalnızca kimliği doğrulanmış içerik sahibine kısıtlar.

Bu kural ne zaman çalışır? Bu kural herkese açık öğeler gerektiren ancak düzenleme erişimini bu öğelerin sahipleriyle kısıtlaması gereken uygulamalar için iyi bir şekilde çalışır. Örneğin, bir sohbet uygulaması veya blog.

Bu kuralın geçerli olmadığı durumlar: Yalnızca içerik sahibi kuralında olduğu gibi, bu kural kümesi de birden fazla kullanıcının aynı verileri düzenlemesi gerektiğinde geçerli olmaz. Kullanıcılar sonunda birbirlerinin verilerinin üzerine yazar.

Bu kuralı ayarlamak için: Tüm kullanıcılar (veya kimliği doğrulanmış tüm kullanıcılar) için okuma erişimini etkinleştiren ve verileri yazan kullanıcının sahibi olduğunu doğrulayan bir kural oluşturun.

Cloud Firestore

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

Realtime Database

{
// 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"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    // Files look like: "user/<UID>/path/to/file.txt"
    match /user/{userId}/{allPaths=**} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

Özellik ve rol tabanlı erişim

Bu kuralların çalışması için verilerinizdeki kullanıcılara özellikler tanımlamanız ve atamanız gerekir. Firebase Security Rules Erişimi onaylamak veya reddetmek için isteği veritabanınızdaki verilerle veya dosyanızın meta verileriyle karşılaştırın.

Bu kural ne zaman işe yarar? Kullanıcılara rol atıyorsanız bu kural, erişimi rollere veya belirli kullanıcı gruplarına göre sınırlandırmayı kolaylaştırır. Örneğin, notları depoluyorsanız "öğrenciler" grubuna (yalnızca içeriklerini okuma), "öğretmenler" grubuna (konularında okuma ve yazma işlemi yapma) ve "okul müdürleri" grubuna (tüm içeriği okuma) farklı erişim düzeyleri atayabilirsiniz.

Bu kuralın çalışmadığı durumlar: Realtime Database ve Cloud Storage'te kurallarınız, Cloud Firestore kurallarının dahil edebileceği get() yönteminden yararlanamaz. Bunun sonucunda, veritabanınızı veya dosya meta verilerinizi, kurallarınızda kullandığınız özellikleri yansıtacak şekilde yapılandırmanız gerekir.

Bu kuralı ayarlamak için: Cloud Firestore'de, kullanıcılarınızın dokümanlarına okuyabileceğiniz bir alan ekleyin. Ardından, kuralınızı bu alanı okuyacak ve koşullu olarak erişim verecek şekilde yapılandırın. Realtime Database ürününde, uygulamanızın kullanıcılarını tanımlayan ve onlara alt düğümde rol atayan bir veri yolu oluşturun.

Ayrıca Authentication içinde özel iddialar oluşturabilir ve ardından bu bilgileri herhangi bir Firebase Security Rules içindeki auth.token değişkeninden alabilirsiniz.

Veri tanımlı özellikler ve roller

Bu kurallar yalnızca Cloud Firestore ve Realtime Database'te çalışır.

Cloud Firestore

Kurallarınızda aşağıdaki kurallar gibi bir okuma işlemi olduğunda Cloud Firestore için okuma işlemi için faturalandırılacağınızı unutmayın.

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, Check a boolean `admin` attribute
    allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    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"
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "${subpath}": {
        //
        ".write": "root.child('users').child(auth.uid).child('role').val() === 'admin'",
        ".read": true
      }
    }
  }
}

Özel hak talebi özellikleri ve rolleri

Bu kuralları uygulamak için Firebase Authentication'de özel iddialar oluşturun ve ardından kurallarınızda bu iddialardan yararlanın.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Create a custom claim for each role or group
        // you want to leverage
        ".write": "auth.uid !== null && auth.token.writer === true",
        ".read": "auth.uid !== null && auth.token.reader === true"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Allow reads if the group ID in your token matches the file metadata's `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;
  }
}

Kiracı özellikleri

Bu kuralları uygulamak için Google Cloud Identity Platform'da (GCIP) çok kiralılık ayarını yapın ve ardından kurallarınızda kiracıdan yararlanın. Aşağıdaki örnekler, belirli bir kiracıdaki (ör.tenant2-m6tyz) bir kullanıcıdan yazma işlemlerine izin verir.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For tenant-based access control, check for a tenantID
    allow write: if request.auth.token.firebase.tenant == 'tenant2-m6tyz';
    allow read: true;
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$uid": {
        // Only allow reads and writes if user belongs to a specific tenant
        ".write": "auth.uid !== null && auth.token.firebase.tenant === 'tenant2-m6tyz'",
        ".read": "auth.uid !== null
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Only allow reads and writes if user belongs to a specific tenant
  match /files/{tenantId}/{fileName} {
    allow read: if request.auth != null;
    allow write: if request.auth.token.firebase.tenant == tenantId;
  }
}