Temel Güvenlik Kuralları

Firebase Security Rules, depolanan verilerinize erişimi kontrol etmenize olanak tanır. Esnek kurallar söz dizimi, tüm yazmalardan web sitenize kadar her şeyle eşleşen veritabanının tamamını belirli bir belgedeki işlemlere dönüştürün.

Bu kılavuzda, isteyebileceğiniz daha temel kullanım örneklerinden bazıları ve verilerinizin güvenliğini sağlama konusunda daha fazla şekilde bilgilendirilmeniz gerekir. 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 cihazınızın verilerinize erişimi kısıtlayıp kısıtlamayacağını seçebilirsiniz (Kilitli mod) veya herkesin erişimine izin verin (Test modu). Cloud Firestore içinde ve Kilitli mod'un varsayılan kuralları olan Realtime Database, tüm kullanıcıların erişimine izin vermez. Cloud Storage ürününde 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. Öncesinde Rules güncellediğinizden emin olun. uygulamanızı üretime dağıtmanıza yardımcı olur. Ayrıca, uygulamanızı dağıtırsanız lançlamamış olsanız bile herkese açık olacağını unutmayın.

Firebase'in, müşterilerin verilerinize doğrudan erişmesine olanak sağladığını ve Kötü amaçlı kullanıcılar için erişimi engelleyen tek teminat Firebase Security Rules. 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

Verilerinizi yalnızca yetkili olan ve oturum açmış durumdayken, kimliği doğrulanmış herhangi bir kullanıcıya erişimi en iyi uygulamadır.

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 korunmasını ve gerektiği gibi verilmesi gerekir. Kullanıcıya dayalı erişim ayarlamak için Authentication'ten yararlanın ve veri tabanınızdan doğrudan okumak için veri tabanı erişimi ayarlayın.

Verilerinizi yapılandırırken kurallar yazmayı düşünün farklı yerlerde verilere erişimi kısıtlama şeklinizi etkiler. yollar.

Yalnızca içerik sahibi erişimi

Bu kurallar, erişimi yalnızca içeriğin kimliği doğrulanmış sahibiyle kısıtlar. İlgili içeriği oluşturmak için kullanılan veriler yalnızca tek bir kullanıcı tarafından okunabilir ve yazılabilir durumdadır ve veri yolu kullanıcı kimliği.

Bu kural ne zaman çalışır?: Veriler kullanıcı tarafından birbirinden ayrılıyorsa (örneğin, Verilere erişmesi gereken tek kullanıcı, dışı verilerdir.

Bu kural çalışmadığında: Birden fazla kullanıcı olduğunda bu kural grubu çalışmaz aynı verileri yazması veya okuması gerekir. Kullanıcılar verilerin üzerine yazar veya ve oluşturdukları verilere erişmek istiyor.

Bu kuralı oluşturmak için: Erişim isteyen kullanıcıyı onaylayan bir kural oluşturun verilerin sahibi olan kullanıcıdır.

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 özel 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 olarak kullanılmasını gerektiren uygulamalar için uygundur ancak bu öğelere düzenleme erişimini kısıtlaması gerekiyorsa sahip olanlar. Örneğin, bir sohbet uygulaması veya blog.

Bu kural çalışmadığında: "Yalnızca içerik sahibi" kuralı gibi bu kural grubu da birden çok kullanıcının aynı verileri düzenlemesi gerektiğinde çalışmaz. Kullanıcılar birbirinin verilerinin üzerine yazar.

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

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

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 tabanlı 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, isteği veritabanınızdaki veya dosyanızdaki verilerle karşılaştırarak kontrol eder. meta verileri kullanır.

Bu kural çalıştığında: Kullanıcılara bir rol atıyorsanız bu kural rollere veya belirli kullanıcı gruplarına göre erişimi kolayca sınırlandırabilirsiniz. Örneğin, notları depoladıysanız, notları farklı erişim düzeyleri ile "öğrenciler" grubu (yalnızca içeriklerini okuma), "öğretmenler" grup (konularında okuma ve yazma) ve "ana hesap" gibi grup (tüm içeriği oku).

Bu kural çalışmadığında: Realtime Database ve Cloud Storage için kurallarınız Cloud Firestore kurallarının uygulayabileceği get() yönteminden yararlanılamıyor. Bu nedenle, veritabanınızı veya dosya meta verilerinizi, kurallarınızda kullandığınız özellikleri yansıtacak şekilde yapılandırmanız gerekir.

Bu kuralı oluşturmak için: Cloud Firestore dosyasında, kullanıcılarınızın olacak şekilde yapılandırın ve alanına giriş yapıp koşullu olarak erişim izni verebilirsiniz. Realtime Database'te, 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 sayfasında özel hak talepleri oluşturabilirsiniz. ve daha sonra bu bilgileri Herhangi bir Firebase Security Rules içindeki auth.token değişkeni.

Veri tanımlı özellikler ve roller

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

Cloud Firestore

Kurallarınız aşağıdaki kurallar gibi bir okuma içerdiğinde, Cloud Firestore bölgesinde bir okuma işlemi için faturalandırılıyorsunuz.

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 örneklerde yazma işlemine izin verilir belirli bir kiracıdaki bir kullanıcıdan tenant2-m6tyz

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