Firebase Security Rules: veritabanını açık bırakmayı bırak
Firebase web uygulamaları; Firestore, Realtime Database ve Cloud Storage'a herkesin görebildiği bir yapılandırma nesnesiyle doğrudan tarayıcıdan okuma ve yazma yapar. Bir isteğe izin verilip verilmeyeceğine yalnızca Security Rules karar verir. Test mode'da bırakılan ya da her şeye izin verecek şekilde gevşetilen kurallar, tüm veritabanını internete açar.
Nedir
Security Rules, her okuma ve yazma için Google'ın sunucularında değerlendirilen küçük bir policy dilidir. Her match bloğu bir yolu hedefler — bir koleksiyon, bir doküman, bir storage klasörü — ve allow ifadeleri, request.auth (isteği kimin yaptığı) ve request.resource.data (ne yazmaya çalıştığı) kullanılarak hangi işlemlere hangi koşullarda izin verildiğini belirtir.
apiKey dahil Firebase web config'i yalnızca projeni tanımlar; bir secret değildir ve tek başına erişim sağlamaz. Kuralların bu kadar önemli olmasının nedeni budur: herhangi bir ziyaretçi Firebase SDK'sını senin config'inle başlatıp veritabanını doğrudan kendi tarayıcı konsolundan sorgulayabilir.
Neden önemli
Firestore'un test mode'u, bir son kullanma tarihine kadar tüm okuma ve yazmalara izin verir. Süre dolup uygulama bozulduğunda yaygın bir "çözüm" allow read, write: if true olur — bu da her dokümanı herkes tarafından okunabilir ve yazılabilir bırakır. Açıkta kalan Firebase veritabanları tekrar eden büyük veri sızıntılarının kaynağıdır ve bulunup dökülmeleri son derece kolaydır.
Yalnızca request.auth != null kontrol eden kurallar pek daha iyi değildir: herkes, çoğu zaman anonim olarak, bir hesap oluşturup tüm kullanıcıların verilerini okuyabilir. Yazmalar doğrulanmazsa, kullanıcılar asla kontrol etmemeleri gereken alanları da düzenleyebilir — örneğin kendi profillerinde role: "admin" ayarlamak gibi.
Nasıl düzeltilir
Varsayılan olarak reddet ve erişimi koleksiyon bazında ver. Burada her kullanıcı users içinde yalnızca kendi dokümanını okuyup yazabilir, başka hiçbir şeye ulaşılamaz.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read, write: if request.auth != null
&& request.auth.uid == userId;
}
// Every other path is denied by default.
}
}Kullanıcının hangi alanları değiştirebileceğini kısıtla; böylece kendini yükseltemez veya sunucunun yönettiği verilerle oynayamaz. affectedKeys().hasOnly(), başka alanlara dokunan her update'i reddeder.
match /users/{userId} {
allow update: if request.auth.uid == userId
&& request.resource.data.diff(resource.data)
.affectedKeys().hasOnly(["displayName", "photoURL"]);
}Kurallarında geniş bir allow ile birleşen match /{document=**} ifadelerini, if true kullanımlarını ve süresi dolan test mode zaman damgalarını ara. Cloud Storage ve Realtime Database'in ayrı kural dosyaları olduğunu unutma — onları da kilitle.
Okumaları kimliği doğrulanmamış bir kullanıcı olarak ve oturum açmış farklı bir kullanıcı olarak çalıştırmak için Firebase konsolundaki Rules Playground'u ya da @firebase/rules-unit-testing ile Emulator Suite'i kullan. Hızlı bir dış kontrol, kimliği doğrulanmamış bir REST isteğidir — doküman döndürüyorsa koleksiyon herkese açıktır.
curl "https://firestore.googleapis.com/v1/projects/<project-id>/databases/(default)/documents/users"SSS
Firebase apiKey'im bir secret mı?
Hayır. Firebase web config'indeki apiKey projeni tanımlar ve tarayıcıya gönderilmek üzere tasarlanmıştır. Verilerini Security Rules ile koru ve key'i Google Cloud'da uygulamanın gerçekten kullandığı API'lerle sınırla; böylece başka ücretli Google servisleri için yeniden kullanılamaz.
request.auth != null yeterli mi?
Nadiren. Yalnızca isteği yapanın oturum açtığını kanıtlar — verinin ona ait olduğunu değil. request.auth.uid'yi doküman sahibiyle karşılaştır veya kullanıcıların kendilerinin ayarlayamayacağı bir rolü kontrol et.
AppSafe Firebase kurallarımı kontrol ediyor mu?
AppSafe Firebase projeni sorgulamaz, bu yüzden kurallarını değerlendiremez — Rules Playground'u veya yukarıdaki curl kontrolünü kullan. Ancak JavaScript'inde bulunan Google API key'lerini (AIza… formatı) işaretler, çünkü aynı format Maps veya Gemini gibi ücretli servisler için de kullanılır. Bir Firebase web config'i için bu beklenen bir durumdur; sadece key'in kısıtlı olduğundan emin ol.
Uygulaman etkileniyor mu?
AppSafe, bunu ve onlarca başka sorunu tek bir ücretsiz taramada kontrol eder.
Uygulamamı ücretsiz taraİlgili rehberler
Supabase Row Level Security (RLS): tablolarını kilitle
Anon key'in herkese açık. Onunla verilerin arasındaki tek şey RLS.
İstemci tarafı JavaScript'te açığa çıkan API key'leri
Bundle'ındaki her şey herkese açıktır. Öyle davran.
Açıkta kalan veritabanı yedekleri: /backup.sql erişilebilir olduğunda ne olur
Erişilebilir bir .sql dump'ı, tüm veritabanını eksiksiz teslim etmek demektir.