The Firebase Web-App panduan menyatakan saya harus meletakkan diberikan apiKey
dalam Html saya untuk menginisialisasi Firebase:
// 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>
Dengan begitu, apiKey
semua pengunjung akan terpapar. Apa tujuan dari kunci itu dan apakah itu benar-benar dimaksudkan untuk umum?
javascript
firebase
farmio
sumber
sumber
Jawaban:
ApiKey dalam cuplikan konfigurasi ini hanya mengidentifikasi proyek Firebase Anda di server Google. Ini bukan risiko keamanan bagi seseorang untuk mengetahuinya. Bahkan, mereka perlu mengetahuinya, agar mereka dapat berinteraksi dengan proyek Firebase Anda. Data konfigurasi yang sama ini juga termasuk dalam setiap aplikasi iOS dan Android yang menggunakan Firebase sebagai pendukungnya.
Dalam arti bahwa sangat mirip dengan URL database yang mengidentifikasi database back-end yang terkait dengan proyek Anda dalam potongan yang sama:
https://<app-id>.firebaseio.com
. Lihat pertanyaan ini tentang mengapa ini bukan risiko keamanan: Bagaimana cara membatasi modifikasi data Firebase? , termasuk penggunaan aturan keamanan sisi server Firebase untuk memastikan hanya pengguna yang berwenang yang dapat mengakses layanan backend.Jika Anda ingin mempelajari cara mengamankan semua akses data ke layanan backend Firebase Anda diotorisasi, bacalah dokumentasi tentang aturan keamanan Firebase .
Jika Anda ingin mengurangi risiko melakukan data konfigurasi ini ke kontrol versi, pertimbangkan untuk menggunakan konfigurasi otomatis SDK dari Firebase Hosting . Meskipun kunci masih akan berakhir di browser dalam format yang sama, mereka tidak akan dikodekan ke dalam kode Anda lagi dengan itu.
sumber
Membangun jawaban prufrofro dan Frank van Puffelen di sini , saya membuat pengaturan ini yang tidak mencegah pengikisan, tetapi dapat membuatnya sedikit lebih sulit untuk menggunakan kunci API Anda.
Peringatan: Untuk mendapatkan data Anda, bahkan dengan metode ini, misalnya, cukup buka konsol JS di Chrome dan ketik:
Hanya aturan keamanan basis data yang dapat melindungi data Anda.
Namun demikian, saya membatasi penggunaan kunci API produksi saya untuk nama domain saya seperti ini:
projectname.firebaseapp.com/*
)Sekarang aplikasi hanya akan bekerja pada nama domain spesifik ini. Jadi saya membuat Kunci API lain yang akan bersifat pribadi untuk pengembangan localhost.
Secara default, seperti yang disebutkan oleh Emmanuel Campos, daftar putih hanya Firebase
localhost
dan domain hosting Firebase Anda .Untuk memastikan saya tidak mempublikasikan kunci API yang salah secara tidak sengaja, saya menggunakan salah satu metode berikut untuk secara otomatis menggunakan yang lebih terbatas dalam produksi.
Pengaturan untuk Buat-Bereaksi-Aplikasi
Dalam
/env.development
:Dalam
/env.production
:Di
/src/index.js
Pengaturan saya sebelumnya untuk Webpack:
Saya menggunakan Webpack untuk membangun aplikasi produksi saya dan saya meletakkan kunci API dev saya di dalam saya
index.html
seperti yang biasa Anda lakukan. Kemudian, di dalamwebpack.production.config.js
file saya , saya mengganti kunci setiap kaliindex.html
disalin ke build produksi:sumber
Saya tidak yakin untuk mengekspos kunci keamanan / konfigurasi ke klien. Saya tidak akan menyebutnya aman, bukan karena seseorang dapat mencuri semua informasi pribadi sejak hari pertama, karena seseorang dapat membuat permintaan berlebihan, dan mengeringkan kuota Anda dan membuat Anda berutang ke Google banyak uang.
Anda perlu memikirkan banyak konsep dari membatasi orang untuk tidak mengakses di tempat yang seharusnya, serangan DOS dll.
Saya lebih suka klien pertama kali akan menekan ke server web Anda, di sana Anda meletakkan apa firewall tangan pertama, captcha, cloudflare, keamanan kustom di antara klien dan server, atau antara server dan firebase dan Anda baik untuk pergi. Setidaknya Anda dapat menghentikan aktivitas yang dicurigai sebelum mencapai firebase. Anda akan memiliki lebih banyak fleksibilitas.
Saya hanya melihat satu skenario penggunaan yang baik untuk menggunakan konfigurasi berbasis klien untuk penggunaan internal. Misalnya, Anda memiliki domain internal, dan Anda cukup yakin bahwa orang luar tidak dapat mengaksesnya, sehingga Anda dapat mengatur lingkungan seperti browser -> tipe firebase.
sumber
Saya percaya begitu aturan basis data ditulis secara akurat, itu akan cukup untuk melindungi data Anda. Selain itu, ada pedoman yang bisa diikuti untuk menyusun database Anda sesuai. Misalnya, membuat simpul UID di bawah pengguna, dan meletakkan semua informasi di bawahnya. Setelah itu, Anda perlu menerapkan aturan basis data sederhana seperti di bawah ini
Tidak ada pengguna lain yang dapat membaca data pengguna lain, apalagi, kebijakan domain akan membatasi permintaan yang datang dari domain lain. Seseorang dapat membaca lebih lanjut tentang itu pada aturan Firebase Security
sumber
Eksposur kunci API menciptakan kerentanan saat pendaftaran pengguna / kata sandi diaktifkan. Ada titik akhir API terbuka yang mengambil kunci API dan memungkinkan siapa pun untuk membuat akun pengguna baru. Mereka kemudian dapat menggunakan akun baru ini untuk masuk ke aplikasi Firebase Auth yang Anda lindungi atau menggunakan SDK untuk auth dengan pengguna / pass dan menjalankan kueri.
Saya sudah melaporkan ini ke Google tetapi mereka mengatakan itu berfungsi sebagaimana mestinya.
Jika Anda tidak dapat menonaktifkan akun pengguna / kata sandi Anda harus melakukan yang berikut: Membuat fungsi cloud untuk secara otomatis menonaktifkan pengguna baru diCreate dan membuat entri DB baru untuk mengelola akses mereka.
Contoh: MyUsers / {userId} / Akses: 0
Perbarui aturan Anda untuk hanya mengizinkan bacaan untuk pengguna dengan akses> 1.
Jika fungsi pendengar tidak menonaktifkan akun dengan cukup cepat maka aturan baca akan mencegah mereka membaca data apa pun.
sumber
Setelah membaca ini dan setelah saya melakukan riset tentang kemungkinan, saya datang dengan pendekatan yang sedikit berbeda untuk membatasi penggunaan data oleh pengguna yang tidak sah:
Saya menyimpan pengguna saya di DB saya juga (dan menyimpan data profil di sana). Jadi saya hanya mengatur aturan db seperti ini:
Dengan cara ini hanya pengguna yang disimpan sebelumnya dapat menambahkan pengguna baru di DB sehingga tidak ada cara siapa pun tanpa akun dapat melakukan operasi pada DB. juga menambahkan pengguna baru hanya mungkin jika pengguna memiliki peran khusus dan hanya mengedit oleh admin atau oleh pengguna itu sendiri (seperti ini):
sumber
Anda tidak boleh mengekspos info ini. di depan umum, khususnya kunci api. Ini dapat menyebabkan kebocoran privasi.
Sebelum membuat situs web menjadi publik, Anda harus menyembunyikannya. Anda dapat melakukannya dengan 2 cara atau lebih
sumber