Firebase Realtime Database Güvenlik – Derinlemesine Rehber

Firebase Realtime Database Güvenlik – Derinlemesine Rehber

🔐 Firebase Realtime Database Güvenlik – Derinlemesine Rehber

Firebase Realtime Database, verileri gerçek zamanlı olarak senkronize eden güçlü bir NoSQL sistemdir. Ancak yanlış yapılandırılmış kurallar, ciddi güvenlik açıklarına neden olabilir. Bu rehberde, güvenlik kurallarını profesyonel düzeyde öğreneceksiniz.

1. Neden Güvenlik Kuralları Önemlidir?

Realtime Database hız ve kolaylık sağlar, ancak test aşamasında bırakılan "read": "true" veya "write": "true" gibi kurallar veritabanını herkese açık hale getirir. Güvenlik kuralları, verilerinizi yetkisiz erişimden korur.

2. Güvenlik Kurallarının Yapısı

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

Bu yapı, yalnızca kimliği doğrulanmış kullanıcıların veriyi okumasına ve yazmasına izin verir.

3. Authentication ile Entegrasyon

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    }
  }
}

Her kullanıcı giriş yaptığında auth.uid değeri oluşur. Bu UID, kurallarda kimlik doğrulama için kullanılır ve kullanıcı yalnızca kendi verisine erişebilir.

4. Veri Doğrulama (.validate)

{
  "rules": {
    "posts": {
      "$post_id": {
        ".write": "auth != null",
        ".validate": "newData.child('title').isString() && newData.child('title').val().length < 100"
      }
    }
  }
}

Bu kural, title alanının metin olmasını ve 100 karakteri geçmemesini sağlar. Veri doğrulama, hatalı veya kötü niyetli veri girişini engeller.

5. Role-Based Access (Rol Tabanlı Yetkilendirme)

{
  "rules": {
    "admins": {
      ".read": "auth.token.role == 'admin'",
      ".write": "auth.token.role == 'admin'"
    },
    "users": {
      "$uid": {
        ".read": "auth.uid == $uid",
        ".write": "auth.uid == $uid"
      }
    }
  }
}

Authentication tarafında özel claim eklenerek kullanıcı rolleri tanımlanır. Bu yöntem, admin paneli veya yönetici yetkileri için idealdir.

6. Zaman Bazlı Kurallar

{
  "rules": {
    "events": {
      "$event_id": {
        ".read": "auth != null && now < 1735689600000"
      }
    }
  }
}

now milisaniye cinsinden zaman damgasıdır. Bu örnek, 2024 yılı sonuna kadar erişime izin verir.

7. İndeksleme (.indexOn)

{
  "rules": {
    "posts": {
      ".indexOn": ["author", "timestamp"]
    }
  }
}

Bu sayede orderByChild('author') gibi sorgular daha hızlı çalışır. İndeksleme performans optimizasyonu sağlar.

8. Nested Kurallar ve Hiyerarşi

{
  "rules": {
    "projects": {
      "$project_id": {
        "tasks": {
          "$task_id": {
            ".read": "auth != null && auth.uid == root.child('projects').child($project_id).child('owner').val()"
          }
        }
      }
    }
  }
}

Bu örnek, yalnızca proje sahibine ait görevlerin okunmasına izin verir. Hiyerarşik yapı, karmaşık veri modellerinde güvenliği kolaylaştırır.

9. Emulator ile Test

firebase emulators:start --only database

Emulator ile kuralları test ederek .read, .write ve .validate işlemlerinin doğru çalıştığını kontrol edin. Hatalı kurallar veri sızıntısına neden olabilir.

10. Sık Yapılan Hatalar

  • ".read": "true" → Herkes veriyi görebilir.
  • ".write": "true" → Herkes veri değiştirebilir.
  • Authentication olmadan erişim → Güvenlik tamamen ortadan kalkar.
  • Her zaman auth != null kontrolü ekleyin.

11. En İyi Uygulamalar

  • Varsayılan erişimi kapat (".read": "false", ".write": "false")
  • Gereksiz izinleri kaldırın
  • Veri doğrulama ekleyin
  • Emulator kullanın
  • Minimum yetki prensibini uygulayın

12. Firestore ile Farkları

ÖzellikRealtime DatabaseFirestore
Veri YapısıJSON ağacıKoleksiyon-doküman
Kurallar FormatıJSONDSL (Domain Specific Language)
PerformansGerçek zamanlı, hızlıDaha ölçeklenebilir
Güvenlik.read, .write, .validateallow read, write: if ...
İndeksleme.indexOnOtomatik indeksleme

13. Örnek Senaryo: Chat Uygulaması Güvenliği

{
  "rules": {
    "messages": {
      "$chat_id": {
        "$message_id": {
          ".read": "auth != null && root.child('chats').child($chat_id).child('members').hasChild(auth.uid)",
          ".write": "auth != null && root.child('chats').child($chat_id).child('members').hasChild(auth.uid)"
        }
      }
    }
  }
}

Bu yapı, yalnızca sohbet üyelerinin mesajlara erişmesini sağlar. Gerçek

Yorumlar

Bu blogdaki popüler yayınlar

YouTube ile Web Sitesi SEO'su: Kapsamlı Strateji Rehberi

Uygulama Reklam Butonu