Firebase Realtime Database Güvenlik Kurallarını Anlama

Firebase Realtime Database Güvenlik Kuralları, veritabanınıza kimlerin okuma ve yazma erişimi olduğunu, verilerinizin nasıl yapılandırıldığını ve hangi dizinlerin bulunduğunu belirler. Bu kurallar Firebase sunucularında bulunur ve her zaman otomatik olarak uygulanır. Her okuma ve yazma isteği yalnızca kurallarınız izin veriyorsa tamamlanır. Varsayılan olarak, kurallarınız veritabanınıza erişime izin vermez. Bu, kurallarınızı özelleştirmek veya kimlik doğrulama ayarlamak için zamanınız olana kadar veritabanınızı kötüye kullanıma karşı korumak içindir.

Realtime Database güvenlik kuralları, JavaScript benzeri bir söz dizimine sahiptir ve dört türde gelir:

Kural Türleri
.read Verilerin kullanıcılar tarafından okunmasına izin verilip verilmediğini ve izin veriliyorsa ne zaman izin verildiğini açıklar.
.write Verilerin yazılmasına izin verilip verilmediğini ve izin veriliyorsa ne zaman izin verildiğini açıklar.
.validate Doğru biçimlendirilmiş bir değerin nasıl görüneceğini, alt özelliklere sahip olup olmadığını ve veri türünü tanımlar.
.indexOn Sıralama ve sorgulamayı desteklemek için dizine eklenecek bir alt öğe belirtir.

Realtime Database Güvenliğe genel bakış

Firebase Realtime Database, uygulamanızın güvenliğini yönetmek için eksiksiz bir araç seti sunar. Bu araçlar, kullanıcılarınızın kimliğini doğrulamanızı, kullanıcı izinlerini zorunlu kılmanızı ve girişleri doğrulamanızı kolaylaştırır.

Firebase destekli uygulamalar, diğer birçok teknoloji yığınına sahip uygulamalara kıyasla daha fazla istemci tarafı kodu çalıştırır. Bu nedenle, güvenliğe yaklaşımımız alışkın olduğunuzdan biraz farklı olabilir.

Doğrulama

Uygulamanızı güvenli hale getirme sürecinde genellikle ilk adım, kullanıcılarınızı tanımlamaktır. Bu sürece kimlik doğrulama denir. Kullanıcıların uygulamanızda oturum açmasını sağlamak için Firebase Authentication'ı kullanabilirsiniz. Firebase Authentication; Google ve Facebook gibi yaygın kimlik doğrulama yöntemlerinin yanı sıra e-posta ve şifreyle giriş, anonim giriş gibi yöntemler için hazır destek içerir.

Kullanıcı kimliği önemli bir güvenlik kavramıdır. Farklı kullanıcıların farklı verileri ve bazen farklı özellikleri vardır. Örneğin, bir sohbet uygulamasında her mesajı oluşturan kullanıcıyla ilişkilendirilir. Kullanıcılar kendi mesajlarını silebilir ancak diğer kullanıcıların yayınladığı mesajları silemez.

Yetkilendirme

Kullanıcınızı tanımlamak, güvenliğin yalnızca bir parçasıdır. Bu kişilerin kim olduğunu öğrendikten sonra, veritabanınızdaki verilere erişimlerini kontrol etmeniz gerekir. Realtime Database güvenlik kuralları, her kullanıcının erişimini kontrol etmenize olanak tanır. Örneğin, herkesin /foo/ yolunu okumasına izin veren ancak kimsenin bu yola yazmasına izin vermeyen bir güvenlik kuralları grubu aşağıda verilmiştir:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

.read ve .write kuralları basamaklı olarak uygulanır. Bu nedenle, bu kural grubu /foo/ yolundaki tüm verilere ve /foo/bar/baz gibi daha derin yollardaki tüm verilere okuma erişimi verir. Veritabanında daha sığ olan .read ve .write kurallarının daha derin kuralları geçersiz kıldığını unutmayın. Bu nedenle, /foo/bar/baz yolundaki bir kural yanlış olarak değerlendirilse bile bu örnekte /foo/bar/baz için okuma erişimi verilmeye devam eder.

Realtime Database güvenlik kuralları, diğer yollara, sunucu tarafı zaman damgalarına, kimlik doğrulama bilgilerine ve daha fazlasına başvurmanıza olanak tanıyan yerleşik değişkenler ve işlevler içerir. Aşağıda, kimliği doğrulanmış kullanıcılara /users/<uid>/ için yazma erişimi veren bir kural örneği verilmiştir. Burada <uid>, Firebase Authentication aracılığıyla elde edilen kullanıcı kimliğidir.

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

Veri doğrulama

Firebase Realtime Database şemasızdır. Bu sayede, geliştirme sürecinde değişiklik yapmak kolaylaşır. Ancak uygulamanız dağıtıma hazır olduğunda verilerin tutarlı kalması önemlidir. Kurallar dilinde, .validate kuralı bulunur. Bu kural, .read ve .write kuralları için kullanılan ifadeleri kullanarak doğrulama mantığı uygulamanıza olanak tanır. Tek fark, doğrulama kurallarının kademeli olarak uygulanmamasıdır. Bu nedenle, yazma işleminin yapılmasına izin verilmesi için ilgili tüm doğrulama kurallarının doğru olarak değerlendirilmesi gerekir.

Bu kurallar, /foo/ konumuna yazılan verilerin 100 karakterden kısa bir dize olmasını zorunlu kılar:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

Doğrulama kuralları, .read ve .write kurallarıyla aynı yerleşik işlevlere ve değişkenlere erişebilir. Bunları, veritabanınızdaki başka yerlerdeki veriler, kullanıcınızın kimliği, sunucu saati ve daha pek çok şeyden haberdar olan doğrulama kuralları oluşturmak için kullanabilirsiniz.

Veritabanı dizinlerini tanımlama

Firebase Realtime Database, verilerin sıralanmasına ve sorgulanmasına olanak tanır. Veri boyutları küçük olduğunda veritabanı anlık sorgulamayı destekler. Bu nedenle, geliştirme sırasında genellikle dizin gerekmez. Ancak uygulamanızı kullanıma sunmadan önce, uygulamanız büyüdükçe sorgularınızın çalışmaya devam etmesini sağlamak için sorgularınızın dizinlerini belirtmeniz önemlidir.

Dizinler, .indexOn kuralı kullanılarak belirtilir. Aşağıda, bir dinozor listesinin yükseklik ve uzunluk alanlarını dizine ekleyecek bir dizin bildirimi örneği verilmiştir:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

Sonraki adımlar