Temel Güvenlik Kuralları

Firebase Güvenlik Kuralları, depolanan verilerinize erişimi kontrol etmenize olanak tanır. Esnek kural sözdizimi, veritabanının tamamına yapılan tüm yazmalardan belirli bir belge üzerindeki işlemlere kadar her şeyle eşleşen kurallar oluşturabileceğiniz anlamına gelir.

Bu kılavuz, uygulamanızı kurarken ve verilerinizi korurken uygulamak isteyebileceğiniz bazı temel kullanım örneklerini açıklamaktadır. Ancak kuralları yazmaya başlamadan önce kuralların yazıldığı dil ve davranışları hakkında daha fazla bilgi edinmek isteyebilirsiniz.

Kurallarınıza erişmek ve bunları güncellemek için Firebase Güvenlik Kurallarını yönetme ve dağıtma bölümünde belirtilen adımları izleyin.

Varsayılan kurallar: Kilitli mod

Firebase konsolunda bir veritabanı veya depolama örneği oluşturduğunuzda, Firebase Güvenlik Kurallarınızın verilerinize erişimi kısıtlayıp kısıtlamayacağını ( Kilitli mod ) veya herkesin erişimine izin verip vermeyeceğini ( Test modu ) seçersiniz. Cloud Firestore ve Realtime Database'de Kilitli modun varsayılan kuralları tüm kullanıcıların erişimini reddeder. Cloud Storage'da yalnızca kimliği doğrulanmış kullanıcılar depolama paketlerine erişebilir.

Bulut Firestore

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

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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 Kurallarınızı güncellediğinizden emin olun. Ayrıca, uygulamanızı dağıtırsanız, siz başlatmamış olsanız bile herkese açık olarak erişilebilir olacağını unutmayın.

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

Kimliği doğrulanmış tüm kullanıcılar

Verilerinizi oturum açmış herhangi bir kullanıcının erişimine bırakmanızı önermesek de, uygulamanızı geliştirirken kimliği doğrulanmış herhangi bir kullanıcının erişimini ayarlamak yararlı olabilir.

Bulut Firestore

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

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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şimi ayarlamak için Kimlik Doğrulamadan yararlanın ve veri tabanlı erişimi ayarlamak için doğrudan veritabanınızdan okuyun.

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

Yalnızca içerik sahibi erişimi

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

Bu kural çalıştığında: Bu kural, veriler kullanıcı tarafından silolanmışsa, yani verilere erişmesi gereken tek kullanıcı, verileri oluşturan kullanıcıyla aynıysa iyi çalışır.

Bu kural işe yaramadığında: Birden fazla kullanıcının aynı verileri yazması veya okuması gerektiğinde bu kural kümesi ç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.

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

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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

Karışık genel ve özel erişim

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

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

Bu kural işe yaramadığında: Yalnızca içerik sahibi kuralı gibi, bu kural kümesi de birden fazla kullanıcının aynı verileri düzenlemesi gerektiğinde çalışmaz. Kullanıcılar sonuçta birbirlerinin verilerinin üzerine yazacaktır.

Bu kuralı ayarlamak için: Tüm kullanıcılara (veya kimliği doğrulanmış tüm kullanıcılara) okuma erişimi sağlayan ve veri yazan kullanıcının sahibi olduğunu doğrulayan bir kural oluşturun.

Bulut Firestore

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 create: if request.auth.uid == request.resource.data.author_uid;
      allow update, delete: if request.auth.uid == resource.data.author_uid;
    }
  }
}

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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

Öznitelik tabanlı ve Rol tabanlı erişim

Bu kuralın çalışması için verilerinizdeki kullanıcılara öznitelikler tanımlamanız ve atamanız gerekir. Firebase Güvenlik Kuralları, erişimi onaylamak veya reddetmek için isteği veritabanınızdaki verilerle veya dosyanızın meta verileriyle karşılaştırarak kontrol eder.

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

Bu kural işe yaramadığında: Gerçek Zamanlı Veritabanı ve Bulut Depolama'da, kurallarınız, Cloud Firestore kurallarının dahil edebileceği get() yönteminden yararlanamaz. Sonuç olarak, veritabanınızı veya dosya meta verilerinizi, kurallarınızda kullandığınız nitelikleri yansıtacak şekilde yapılandırmanız gerekir.

Bu kuralı ayarlamak için: Cloud Firestore'da kullanıcılarınızın belgelerine 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. Gerçek Zamanlı Veritabanında, uygulamanızın kullanıcılarını tanımlayan ve onlara bir alt düğümde rol veren bir veri yolu oluşturun.

Ayrıca Kimlik Doğrulama'da özel talepler ayarlayabilir ve ardından bu bilgiyi herhangi bir Firebase Güvenlik Kuralındaki auth.token değişkeninden alabilirsiniz.

Veri tanımlı özellikler ve roller

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

Bulut Firestore

Kurallarınızın aşağıdaki kurallar gibi bir okuma içerdiği her durumda Cloud Firestore'da bir 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"
   }
  }
}

Gerçek Zamanlı Veritabanı

{
  "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'da özel talepler ayarlayın ve ardından kurallarınızdaki taleplerden yararlanın.

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

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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ızdaki kiracıdan yararlanın. Aşağıdaki örnekler belirli bir kiracıdaki bir kullanıcıdan yazma işlemlerine izin verir; örneğin tenant2-m6tyz

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

Gerçek Zamanlı Veritabanı

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

Bulut depolama

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