Firebase apiKey'i halka göstermek güvenli midir?


438

Firebase Web App kılavuzu bana verilen koymalıyız devletler apiKeyFirebase başlatmak için benim Html:

// TODO: Replace with your project's customized code snippet
<script src="https://www.gstatic.com/firebasejs/3.0.2/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    apiKey: '<your-api-key>',
    authDomain: '<your-auth-domain>',
    databaseURL: '<your-database-url>',
    storageBucket: '<your-storage-bucket>'
  };
  firebase.initializeApp(config);
</script>

Böylece apiKeyher ziyaretçiye maruz kalır. Bu anahtarın amacı nedir ve gerçekten kamuya açık olmak mı gerekiyor?


1
Firebase Auth ve Firebase veritabanı kurallarını ayarladığınız sürece bu bilgileri herkese açık olarak verebileceğinizi düşünüyorum.
abbaf33f

Kullanıcı Christophe Quintard, Firebase API'lerinin güvenliği ile ilgili ek bilgiler içeren çok faydalı bir makaleye bir bağlantı ekledi, bu yüzden burada yeniden gönderiyorum: javebratt.com/hide-firebase-api (Yorum, başka bir kullanıcıya bağlı olduğu için kaybolacak kalitesizlik nedeniyle silinmek için işaretlenen cevap)
Oliver Schafeld

Sadece bu belirli çerçevenin API'sını açığa çıkarmada iyi olduğu için, diğer çerçevelerin onunla iyi olduğu anlamına gelmediğini belirtmek istiyorum. Genel olarak "API Anahtarlarını açığa çıkarmak sorun değil" fikriyle kimsenin bu yayından uzaklaşmasını istemezdim.
YungGun

anahtarları sorunsuz bir şekilde ortaya çıkarırsınız. Güvenli hale getirmek için, üretimdeki belirli bir alanla kısıtlayabilirsiniz, böylece hiç kimse herhangi bir rastgele alan adından çağrı API'sı çağrısı yapamaz. Daha güvenli hale getirmek için üretim uygulamasından localhost kaldırın.
BL Λ CK

1
Localhost'u yönlendirenlerin beyaz listesinden kaldırmanın, testi zorlaştırmak dışında bir şey yapacağını düşünmüyorum. Bu yapılandırma bir IP beyaz listesi gibi değildir; daha çok bir CORS yapılandırması gibi düşünün. Firebase'in çalışma şekli, bu API yollarının doğrudan istemcilerden çağrılmasıdır, proxy edilmezler. Bu nedenle web sayfanızın API anahtarına ihtiyacı var. Kötü bir aktör Postman'dan API rotalarınızı aramak isterse, yönlendiren beyaz listeniz onları durdurmaz. Yalnızca diğer herkese açık sitelerin sunucularınızı engellemesini önlemek için kullanışlıdır.
forresthopkinsa

Yanıtlar:


451

Bu yapılandırma snippet'indeki apiKey, Google sunucularındaki Firebase projenizi tanımlar. Birinin bunu bilmesi bir güvenlik riski değildir. Aslında, Firebase projenizle etkileşime girebilmeleri için bunu bilmesi gerekir. Aynı yapılandırma verileri, Firebase'i arka uç olarak kullanan her iOS ve Android uygulamasında da bulunur.

Bu anlamda bu veritabanı URL'ye çok benzediğini belirler aynı pasajı da projeyle ilişkili arka uç veritabanı: https://<app-id>.firebaseio.com. Bunun neden bir güvenlik riski olmadığına dair şu soruya bakın: Firebase veri değişikliği nasıl kısıtlanır? , yalnızca yetkili kullanıcıların arka uç hizmetlerine erişebilmesini sağlamak için Firebase'in sunucu tarafı güvenlik kurallarının kullanılması dahil.

Firebase arka uç hizmetlerinize tüm veri erişiminin nasıl güvenli hale getirileceğini öğrenmek istiyorsanız, Firebase güvenlik kuralları hakkındaki belgeleri okuyun .


Bu yapılandırma verilerini sürüm denetimine alma riskini azaltmak istiyorsanız , Firebase Hosting'in SDK otomatik yapılandırmasını kullanmayı düşünün . Anahtarlar yine de aynı biçimde tarayıcıda bitecek olsa da, artık kodunuzla kodlanmayacaktır.


7
Yani bu, başkalarının firebase veritabanımdaki tüm verilere erişebileceği anlamına mı geliyor?
Emmanuel Campos

31
@EmmanuelCampos Yanıt Evet ve Hayır. Evet, diğer kişilerin veritabanındaki tüm verilere erişmesine izin veriyorsanız veya vermiyorsanız. Ve hayır, eğer istemiyorsan. Firebase veritabanı kuralları, kontrol ettiğiniz kurallar var
KhoPhi

5
Son sorum için cevabımı burada buldum support.google.com/firebase/answer/6400741 Yardım için teşekkürler. Bu bağlantı gelecekte birisine yardımcı olabilir.
Emmanuel Campos

7
@ m.rufca, verileriniz kimliği doğrulanmış kullanıcılar tarafından kullanılabilir olmalıdır. Ve işte hile. Varsayılan olarak, güvenlik tabanı ayarlarınızda yalnızca localhost ve proje alan adlarınız bunlardan kimlik doğrulama yapmaya yetkilidir. Böylece normalde ateş tabanınızla çalışan başka kimse uygulama oluşturamaz.
Artem Arkhipov

15
bot uygulamamda sınırsız kullanıcı oluşturuyorsa ne olacak? Captcha'yı nasıl isteyebilirim?
Muhammed Umer

79

Burada prufrofro ve Frank van Puffelen'in cevaplarını temel alarak , kazıma işlemini engellemeyen, ancak API anahtarınızı kullanmayı biraz zorlaştıracak bu kurulumu bir araya getirdim.

Uyarı: Bu yöntemle bile verilerinizi almak için örneğin JS konsolunu Chrome'da açıp şunu yazabilirsiniz:

firebase.database().ref("/get/all/the/data").once("value", function (data) {
    console.log(data.val());
});

Yalnızca veritabanı güvenliği kuralları verilerinizi koruyabilir.

Bununla birlikte, üretim API'sı anahtar kullanımımı alan adımla şu şekilde kısıtladım:

  1. https://console.developers.google.com/apis
  2. Firebase projenizi seçin
  3. Kimlik bilgileri
  4. API anahtarları altında, Tarayıcı anahtarınızı seçin. Şöyle görünmelidir: " Tarayıcı anahtarı (Google Hizmeti tarafından otomatik olarak oluşturulur) "
  5. In " Bu HTTP yönlendirmeleri gelen istekleri (web sayfaları) Kabul uygulamanızın URL'sini ekleyin (EXEMPLE:" projectname.firebaseapp.com/*)

Şimdi uygulama yalnızca bu alan adı üzerinde çalışacaktır. Bu yüzden localhost geliştirmesi için özel olacak başka bir API Anahtarı oluşturdum.

  1. Kimlik bilgileri oluştur> API Anahtarı'nı tıklayın

Varsayılan olarak, Emmanuel Campos tarafından belirtildiği gibi, Firebase yalnızca beyaz listeleri localhostve Firebase barındırma alanınızı .


Yanlış API anahtarını yanlışlıkla yayınlamadığımdan emin olmak için, üretimde daha kısıtlı olanı otomatik olarak kullanmak için aşağıdaki yöntemlerden birini kullanıyorum.

Create-React-App Kurulumu

İçinde /env.development:

REACT_APP_API_KEY=###dev-key###

İçinde /env.production:

REACT_APP_API_KEY=###public-key###

İçinde /src/index.js

const firebaseConfig = {
  apiKey: process.env.REACT_APP_API_KEY,
  // ... 
};

Webpack için önceki kurulumum:

Webpack'i üretim uygulamamı oluşturmak için kullanıyorum ve dev API anahtarımı index.htmlnormalde yaptığım gibi içeri sokuyorum . Sonra, dosyamın içinde , üretim yapısına webpack.production.config.jsher index.htmlkopyalandığında anahtarı değiştiriyorum :

plugins: [
    new CopyWebpackPlugin([
      {
        transform: function(content, path) {
          return content.toString().replace("###dev-key###", "###public-key###");
        },
        from: './index.html'
      }
    ])
  ]

1
Bu senin için iyi çalışıyor mu? Bir Android uygulaması için de aynı şeyi yapmayı düşünüyordum. Firebase'in neden güvenlik bölümünde bunu kapsamadığını merak ediyorum.
steliosf

2
Şimdiye kadar hiçbir sorunum olmadı, ama muhtemelen hiçbir saldırı da olmadı
şimdi

3
Bu onların rehberlerinde belirtilmemiştir çünkü sizi kazımaya karşı korumaz. Tüm bunlar, normal iyi davranılmış bir tarayıcıda çalıştırılıyorsa, başkalarının verileri okumak (veya yazmak) için web tabanınızı kullanan bir web uygulaması yapamayacağıdır.
thoutbeckers

@thoutbeckers haklısın, teşekkür ederim. Cevabı düzenledim, ancak yine de faydalı olabileceği için yöntemi bıraktım.
şimdi

1
@FrankvanPuffelen Anladığım kadarıyla, büyük bir fark yaratmıyor, ancak kotanızı kötüye kullanmayı biraz daha can sıkıcı hale getirebilir, çünkü iyi niyetli bir tarayıcıda HTML / JS ile sunulan API anahtarı yalnızca amaçlanan üzerinde çalışacaktır localhost veya başka bir şey değil. Ancak, eklenen korumanın, Firebase'in zaten sağladığına kıyasla marjinal olduğunu kabul ediyorum. Cevabı daha az dramatik bir şeye yeniden yazacağım.
şimdi

22

Güvenlik / yapılandırma anahtarlarını istemciye göstermeye ikna olmadım. Birini ilk günden itibaren tüm özel bilgileri çalabileceği için güvenli olarak adlandırmam, çünkü biri aşırı istekte bulunabilir ve kotanızı boşaltabilir ve Google'a çok para borçlu olabilirsiniz.

Birçok kavramın insanların olması gerektiği yerde erişmemelerini, DOS saldırılarını vb. Kısıtlamasını düşünmelisiniz.

Daha önce istemcinin ilk önce web sunucunuza çarpmasını tercih ederim, orada ilk elden güvenlik duvarı, captcha, cloudflare, istemci ve sunucu arasında veya güvenlik ve sunucu ile firebase arasında özel güvenlik koydunuz ve gitmekte fayda var. En azından şüpheli aktiviteyi ateş tabanına ulaşmadan önce durdurabilirsiniz. Çok daha fazla esnekliğe sahip olacaksınız.

Dahili kullanımlar için istemci tabanlı yapılandırma kullanmak için yalnızca bir iyi kullanım senaryosu görüyorum. Örneğin, dahili etki alanınız vardır ve yabancıların oraya erişemeyeceğinden eminsiniz, böylece tarayıcı -> ateş tabanı türü gibi bir ortam kurabilirsiniz.


10
Ancak başka herhangi bir REST API'sini "ortaya çıkarmak" ile aynı şey değil mi? Yani REST API URL'si kullanıcı tarafından kullanılabilir. URL'yi istedikleri isteklerde bulunabilir ve kotanızı boşaltabilirler. Firebase'in yaptığı, arka ucun bir kısmını tanımlamak için api anahtarları ile config kullanmaktır ve kullanıcının istekte bulunabilmesi için kullanılabilir olması gerekir.
mbochynski

3
@mbochynski ancak fatura ödemenize neden olan kaynaklara biraz doğrudan istekte bulunabilirsiniz. Firebase tarafında, DDoS saldırılarını vb. Önlemek için o kadar fazla kontrol mekanizması yoktur. Benim önerim, müşterinizin REST API'nizi aramasına izin vermek, ancak REST API'sinin API Anahtarlarını özel olarak tutması ve hatta Firebase kaynaklarına basmadan önce bunları doğrulamasıdır. onlar yasal talepler ise. (Cloudflare vb. yoluyla). veya sonuçları önbellekten al. O zaman Firebase kaynaklarınızı sadece ihtiyacınız olduğunda vurursunuz. Firebase.google.com/docs/admin/setup
Teoman shipahi

3
tuşları tarayıcıda açığa çıkarmak ciddi bir fikirdir. bütün bu rehberleri / makaleleri yazanlara ne düşünüyordular? Güvenlik için http yönlendireni? kolayca taklit
Nick Chan Abdullah

1
Siz çocuklar bu hakkı düşünmüyorsunuz. API Anahtarını bir sır olarak düşünmeyin; özel bir anahtar değil, yalnızca bir kimlik olduğundan Firebase API'sı kimin hangi projeye eriştiğini bilir. Çok fazla esneklik istiyorsanız ve sunucu / istemci etkileşiminin her adımını kontrol etmeniz gerekiyorsa, Firebase kullanmamalısınız, GCP kullanmalısınız.
forresthopkinsa

@forresthopkinsa Yukarıdaki bağlantıya hangi yaklaşımı alacağımı söylüyorum. Burada hiç kimse gizli bir anahtar olduğunu öne sürecek kadar saf değil.
Teoman shipahi

4

Veritabanı kuralları doğru bir şekilde yazıldıktan sonra verilerinizi korumak için yeterli olacağına inanıyorum. Ayrıca, bir veritabanı buna göre yapılandırmak için takip edebilirsiniz yönergeleri vardır. Örneğin, kullanıcılar altında bir UID düğümü yapmak ve altındaki tüm bilgileri koymak. Bundan sonra, aşağıdaki gibi basit bir veritabanı kuralı uygulamanız gerekecektir.

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

Başka hiçbir kullanıcı diğer kullanıcıların verilerini okuyamaz, ayrıca alan adı politikası diğer alanlardan gelen istekleri kısıtlamaz. Firebase Güvenlik kuralları hakkında daha fazla bilgi edinebilirsiniz


3

API anahtarına maruz kalma, kullanıcı / parola kaydı etkinleştirildiğinde bir güvenlik açığı oluşturur. API anahtarını alan ve herkesin yeni bir kullanıcı hesabı oluşturmasına izin veren açık bir API uç noktası vardır. Daha sonra Firebase Yetkilendirme korumalı uygulamanızda oturum açmak için bu yeni hesabı kullanabilir veya kullanıcı / geçiş ve çalıştırma sorgularıyla yetkilendirmek için SDK'yı kullanabilirler.

Bunu Google'a bildirdim ancak istendiği gibi çalıştığını söylüyorlar.

Kullanıcı / parola hesaplarını devre dışı bırakamıyorsanız aşağıdakileri yapmanız gerekir: Yeni kullanıcıları otomatik olarak devre dışı bırakmak için bir bulut işlevi oluşturunCreate oluşturun ve erişimlerini yönetmek için yeni bir DB girişi oluşturun.

Örn: MyUsers / {userId} / Erişim: 0

exports.addUser = functions.auth.user().onCreate(onAddUser);
exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);

Kurallarınızı yalnızca erişimi> 1 olan kullanıcılar için okumalara izin verecek şekilde güncelleyin.

Dinleme işlevi, hesabı yeterince hızlı devre dışı bırakmazsa, okuma kuralları herhangi bir veri okumasını engeller.


3

Bunu okuduktan ve olasılıklar hakkında biraz araştırma yaptıktan sonra, yetkisiz kullanıcıların veri kullanımını kısıtlamak için biraz farklı bir yaklaşım geliştirdim:

Kullanıcılarımı DB'ime de kaydediyorum (ve profil verilerini oraya kaydediyorum). Bu yüzden sadece db kurallarını şöyle ayarlayın:

".read": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()",
".write": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()"

Bu şekilde, yalnızca önceden kaydedilmiş bir kullanıcı DB'ye yeni kullanıcılar ekleyebilir, böylece hesabı olmayan herkesin DB'de işlem yapmasının bir yolu yoktur. ayrıca yeni kullanıcılar eklemek yalnızca kullanıcının özel bir rolü varsa ve yalnızca yönetici veya kullanıcının kendisi tarafından düzenlenmesi durumunda mümkündür (böyle bir şey):

"userdata": {
  "$userId": {
    ".write": "$userId === auth.uid || root.child('/userdata/'+auth.uid+'/userRole').val() === 'superadmin'",
   ...

-2

Bu bilgiyi ifşa etmemelisiniz. halka açık, özel api anahtarları. Bir gizlilik sızıntısına neden olabilir.

Web sitesini herkese açık hale getirmeden önce gizlemelisiniz. Bunu 2 veya daha fazla şekilde yapabilirsiniz

  1. Karmaşık kodlama / gizleme
  2. Firebase SDK kodlarını web sitenizin veya uygulamanızın altına koyun, böylece firebase otomatik olarak tüm işleri yapar. API anahtarlarını herhangi bir yere koymanıza gerek yoktur

1
Firebase'den, "Bu komut dosyalarını kopyalayıp <body> etiketinizin altına yapıştırın, ancak herhangi bir Firebase hizmetini kullanmadan önce", API anahtarını içeren alıntı yapıyorum
Luke-zhang-04
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.