Temel Güvenlik Kuralları

Firebase Security Rules depolanan verilerinize erişimi kontrol etmenize olanak tanır. Esnek kurallar söz dizimi sayesinde, tüm yazma işlemlerinden veritabanının tamamına ve belirli bir belgedeki işlemlere kadar her şeyi eşleştiren kurallar oluşturabilirsiniz.

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

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

Varsayılan kurallar: Kilitli mod

Firebase konsolunda bir veritabanı veya depolama örneği oluşturduğunuzda, Firebase Security Rules verilerinizin erişimini kısıtlayıp kısıtlamayacağını (Kilitli mod) veya herkese erişime izin verip vermeyeceğinizi (Test modu) seçersiniz. Cloud Firestore ve Realtime Database'de Kilitli mod için varsayılan kurallar, tüm kullanıcıların erişimini engeller. Cloud Storage içinde, depolama paketlerine yalnızca kimliği doğrulanmış kullanıcılar 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 false;
    }
  }
}

Geliştirme ortamı kuralları

Uygulamanız üzerinde çalışırken verilerinize nispeten açık veya sınırsız erişmek isteyebilirsiniz. Uygulamanızı üretime dağıtmadan önce Rules sürümünü güncellediğinizden emin olun. Ayrıca, uygulamanızı dağıtırsanız başlatmamış olsanız bile herkese açık olarak erişilebileceğini unutmayın.

Firebase'in, istemcilerin verilerinize doğrudan erişmesine izin verdiğini ve Firebase Security Rules'nın kötü niyetli kullanıcıların erişimini engelleyen tek güvenlik önlemi olduğunu unutmayın. Kuralları ürün mantığından ayrı olarak tanımlamanın çeşitli avantajları vardır: Müşteriler güvenliği zorunlu kılmaktan sorumlu değildir, hatalı uygulamalar verilerinizi tehlikeye atmaz ve en önemlisi, verileri dünyadan korumak için bir aracı sunucuya güvenmezsiniz.

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

Verilerinize oturum açmış tüm kullanıcıların erişebilmesini önermesek de uygulamanızı geliştirirken erişimi kimliği doğrulanmış tüm kullanıcılara açmak faydalı olabilir.

Cloud Firestore

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

Realtime Database

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

Cloud Storage

service firebase.storage {
  match /b/{bucket}/o {
    match /some_folder/{fileName} {
      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 erişimin doğru şekilde verildiğinden emin olun. Kullanıcı tabanlı erişimi ayarlamak için Authentication, veri tabanlı erişimi ayarlamak içinse doğrudan veritabanınızdan okuma özelliğini kullanın.

Verilerinizi yapılandırırken kurallar yazmayı düşünün. Çünkü kurallarınızı ayarlama şekliniz, farklı yollardaki verilere erişimi nasıl kısıtladığınızı etkiler.

Yalnızca içerik sahibine özel erişim

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

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

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

Bu kuralı ayarlamak için: Verileri okuma veya yazma erişimi isteyen kullanıcının, söz konusu verilerin sahibi olan kullanıcı 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}/{document} {
      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>/file.txt"
    match /user/{userId}/{fileName} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Karma herkese açık ve özel erişim

Bu kural, herkesin bir veri kümesini okumasına izin verir ancak belirli bir yoldaki verileri oluşturma veya değiştirme özelliğini yalnızca kimliği doğrulanmış içerik sahibiyle kısıtlar.

Bu kuralın işe yaradığı durumlar: Bu kural, herkese açık olarak okunabilir öğeler gerektiren ancak bu öğelerin sahiplerinin düzenleme erişimini kısıtlaması gereken uygulamalar için uygundur. Örneğin, bir sohbet uygulaması veya blog.

Bu kuralın çalışmadığı durumlar: Yalnızca içerik sahibine yönelik kural gibi, bu kural grubu da birden fazla kullanıcının aynı verileri düzenlemesi gerektiğinde çalışmaz. 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 veri yazan kullanıcının sahip olduğunu onaylayan 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>/file.txt"
    match /user/{userId}/{fileName} {
      allow read;
      allow write: if request.auth.uid == userId;
    }
  }
}

Özellik tabanlı ve rol tabanlı erişim

Bu kuralın çalışması için verilerinizdeki kullanıcılara özellikleri tanımlayıp atamanız gerekir. Firebase Security Rules Erişimi onaylamak veya reddetmek için isteği veritabanınızdaki ya da dosyanızın meta verilerindeki verilerle karşılaştırın.

Bu kuralın işe yaradığı durumlar: Kullanıcılara rol atıyorsanız bu kural, erişimi roller veya belirli kullanıcı gruplarına göre sınırlamanıza olanak tanır. Örneğin, notları saklıyorsanız "öğrenciler" grubuna (yalnızca içeriklerini okuma), "öğretmenler" grubuna (konularında okuma ve yazma) ve "müdürler" grubuna (tüm içeriği okuma) farklı erişim düzeyleri atayabilirsiniz.

Bu kuralın çalışmadığı durumlar: Realtime Database ve Cloud Storage'de kurallarınız, Cloud Firestore kurallarının kullanabileceği get() yöntemini kullanamaz. Bu nedenle, kurallarınızda kullandığınız özellikleri yansıtacak şekilde veritabanınızı veya dosya meta verilerinizi yapılandırmanız gerekir.

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

Ayrıca Authentication içinde Firebase Security Rules'de Firebase Security Rules'deki auth.token değişkeninden bu bilgileri alabilirsiniz.

Verilerle tanımlanan özellikler ve roller

Bu kurallar yalnızca Cloud Firestore ve Realtime Database'da geçerlidir.

Cloud Firestore

Kurallarınızda okuma işlemi olduğunda (ör. aşağıdaki kurallar) Cloud Firestore'da 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 talep özellikleri ve rolleri

Bu kuralları uygulamak için Firebase Authentication içinde özel talepler oluşturun ve ardından talepleri kurallarınızda kullanın.

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an administrator 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 use
        ".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ılık özellikleri

Bu kuralları uygulamak için Google Cloud Identity Platform'da (GCIP) çoklu kiracılığı ayarlayın ve ardından kurallarınızda kiracıyı kullanın. Aşağıdaki örnekler, belirli bir kiracıdaki bir kullanıcının (ör. tenant2-m6tyz) 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;
  }
}