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 != nullkontrolü 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ı
| Özellik | Realtime Database | Firestore |
|---|---|---|
| Veri Yapısı | JSON ağacı | Koleksiyon-doküman |
| Kurallar Formatı | JSON | DSL (Domain Specific Language) |
| Performans | Gerçek zamanlı, hızlı | Daha ölçeklenebilir |
| Güvenlik | .read, .write, .validate | allow read, write: if ... |
| İndeksleme | .indexOn | Otomatik 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
Yorum Gönder