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 tüm veritabanı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 kural 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 Security Rules yönetme ve dağıtma başlıklı makalede belirtilen adımları uygulayın.

Yapay zeka desteği için aşağıdaki istemi yapay zeka kodlama aracınıza (Android Studio'daki Gemini, Antigravity, Claude Code, Codex ve Cursor gibi) kopyalayın. İstemi özelleştirebilir ve temsilcinizle birlikte yineleme yapabilirsiniz. Ayrıntılı yükleme bilgileri için Firebase aracı becerileri sayfasını ziyaret edin.

Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me write, validate, and deploy Firebase Security Rules to protect my app's data.

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 Security 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'nin kötü niyetli kullanıcıların erişimini engelleyen tek güvenlik önlemi olduğunu unutmayın. Kuralların ürün mantığından ayrı olarak tanımlanmasını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 ayarlamak 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 uygun şekilde verildiğinden emin olun. Kullanıcı tabanlı erişimi ayarlamak için Authentication'ı kullanın ve veri tabanlı erişimi ayarlamak için doğrudan veri tabanınızdan okuyun.

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 sahibinin erişebileceği içerikler

Bu kurallar, içeriğin kimliği doğrulanmış sahibi dışındaki kullanıcıların erişimini 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 sonuç verir.

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 okunabilen öğ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: Bu kural grubu, yalnızca içerik sahibinin kuralı gibi, 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;
    }
  }
}

Özelliğe dayalı ve role dayalı 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 veya dosyanızın meta verilerindeki verilerle karşılaştırır.

Bu kuralın işe yaradığı durumlar: Kullanıcılara rol atıyorsanız bu kural, rollere veya belirli kullanıcı gruplarına göre erişimi sınırlamanıza olanak tanır. Örneğin, notları saklıyorsanız "öğrenciler" grubuna (yalnızca içeriklerini okuma), "öğretmenler" grubuna (konularını 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 bölümünde, 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 özel talepler ayarlayabilir ve ardından bu bilgileri herhangi bir Firebase Security Rules içindeki auth.token değişkeninden 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 içinde okuma işlemi için faturalandırılırsınız.

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 müşteri mimarisini ayarlayın ve ardından kurallarınızda kiracıyı kullanın. Aşağıdaki örnekler, belirli bir kiracıdaki (ör. tenant2-m6tyz) bir kullanıcının 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;
  }
}