Im Firebase Web-App-Handbuch heißt es, dass ich das apiKey
Folgende in mein HTML einfügen sollte, um Firebase zu initialisieren:
// 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>
Auf diese Weise ist das apiKey
jedem Besucher ausgesetzt. Was ist der Zweck dieses Schlüssels und soll er wirklich öffentlich sein?
javascript
firebase
farmio
quelle
quelle
Antworten:
Der apiKey in diesem Konfigurations-Snippet identifiziert lediglich Ihr Firebase-Projekt auf den Google-Servern. Es ist kein Sicherheitsrisiko für jemanden, es zu wissen. Tatsächlich müssen sie es wissen, damit sie mit Ihrem Firebase-Projekt interagieren können. Dieselben Konfigurationsdaten sind auch in jeder iOS- und Android-App enthalten, die Firebase als Backend verwendet.
In diesem Sinne ist es der Datenbank-URL sehr ähnlich, die die mit Ihrem Projekt verknüpfte Back-End-Datenbank in demselben Snippet identifiziert :
https://<app-id>.firebaseio.com
. In dieser Frage erfahren Sie, warum dies kein Sicherheitsrisiko darstellt: Wie kann die Änderung von Firebase-Daten eingeschränkt werden? , einschließlich der Verwendung der serverseitigen Sicherheitsregeln von Firebase, um sicherzustellen, dass nur autorisierte Benutzer auf die Backend-Dienste zugreifen können.Wenn Sie erfahren möchten, wie der gesamte Datenzugriff auf Ihre Firebase-Backend-Dienste autorisiert wird, lesen Sie die Dokumentation zu den Firebase-Sicherheitsregeln .
Wenn Sie das Risiko verringern möchten, diese Konfigurationsdaten für die Versionskontrolle zu übernehmen, sollten Sie die automatische SDK-Konfiguration von Firebase Hosting verwenden . Während die Schlüssel immer noch im selben Format im Browser landen, werden sie damit nicht mehr fest in Ihren Code codiert.
quelle
Aufbauend auf den Antworten von Prufrofro und Frank van Puffelen habe ich dieses Setup zusammengestellt, das das Scraping nicht verhindert, aber die Verwendung Ihres API-Schlüssels etwas erschweren kann.
Warnung: Um Ihre Daten auch mit dieser Methode abzurufen, können Sie beispielsweise einfach die JS-Konsole in Chrome öffnen und Folgendes eingeben:
Nur die Datenbanksicherheitsregeln können Ihre Daten schützen.
Trotzdem habe ich die Verwendung meines Produktions-API-Schlüssels wie folgt auf meinen Domain-Namen beschränkt:
projectname.firebaseapp.com/*
)Jetzt funktioniert die App nur noch mit diesem bestimmten Domainnamen. Also habe ich einen weiteren API-Schlüssel erstellt, der für die Entwicklung von localhost privat ist.
Wie von Emmanuel Campos erwähnt, sind Firebase
localhost
standardmäßig nur Whitelists und Ihre Firebase-Hosting-Domain .Um sicherzustellen, dass ich nicht versehentlich den falschen API-Schlüssel veröffentliche, verwende ich eine der folgenden Methoden, um automatisch den eingeschränkteren in der Produktion zu verwenden.
Setup für Create-React-App
In
/env.development
:In
/env.production
:Im
/src/index.js
Mein vorheriges Setup für Webpack:
Ich verwende Webpack, um meine Produktions-App zu erstellen, und stecke meinen Dev-API-Schlüssel
index.html
wie gewohnt in meinen . Dannwebpack.production.config.js
ersetze ich in meiner Datei den Schlüssel jedes Mal, wenn erindex.html
in den Produktionsbuild kopiert wird:quelle
Ich bin nicht davon überzeugt, Sicherheits- / Konfigurationsschlüssel dem Client zur Verfügung zu stellen. Ich würde es nicht als sicher bezeichnen, nicht weil jemand vom ersten Tag an alle privaten Informationen stehlen kann, weil jemand übermäßige Anfragen stellen und Ihr Kontingent belasten und Sie Google viel Geld schulden lassen kann.
Sie müssen über viele Konzepte nachdenken, von der Beschränkung des Zugriffs auf Personen, auf die sie nicht zugreifen sollen, DOS-Angriffe usw.
Ich würde es vorziehen, wenn der Client zuerst auf Ihren Webserver gelangt. Dort setzen Sie Firewall, Captcha, Cloudflare und benutzerdefinierte Sicherheit aus erster Hand zwischen Client und Server oder zwischen Server und Firebase und los geht's. Zumindest können Sie verdächtige Aktivitäten zuerst stoppen, bevor sie die Feuerbasis erreichen. Sie haben viel mehr Flexibilität.
Ich sehe nur ein gutes Verwendungsszenario für die Verwendung der clientbasierten Konfiguration für interne Verwendungen. Sie haben beispielsweise eine interne Domäne und sind sich ziemlich sicher, dass Außenstehende dort nicht darauf zugreifen können, sodass Sie eine Umgebung wie Browser -> Firebase-Typ einrichten können.
quelle
Ich glaube, sobald die Datenbankregeln korrekt geschrieben sind, reicht es aus, Ihre Daten zu schützen. Darüber hinaus gibt es Richtlinien, nach denen Sie Ihre Datenbank entsprechend strukturieren können. Erstellen Sie beispielsweise einen UID-Knoten unter Benutzern und fügen Sie alle unter Informationen darunter ein. Danach müssen Sie eine einfache Datenbankregel wie folgt implementieren
Kein anderer Benutzer kann die Daten anderer Benutzer lesen. Darüber hinaus schränkt die Domänenrichtlinie Anforderungen von anderen Domänen ein. Weitere Informationen finden Sie in den Firebase-Sicherheitsregeln
quelle
Die API-Schlüsselbelichtung verursacht eine Sicherheitsanfälligkeit, wenn die Benutzer- / Kennwortanmeldung aktiviert ist. Es gibt einen offenen API-Endpunkt, der den API-Schlüssel verwendet und es jedem ermöglicht, ein neues Benutzerkonto zu erstellen. Sie können sich dann mit diesem neuen Konto bei Ihrer Firebase Auth-geschützten App anmelden oder das SDK verwenden, um sich mit Benutzer / Pass zu authentifizieren und Abfragen auszuführen.
Ich habe dies Google gemeldet, aber sie sagen, dass es wie beabsichtigt funktioniert.
Wenn Sie Benutzer- / Kennwortkonten nicht deaktivieren können, sollten Sie folgende Schritte ausführen: Erstellen Sie eine Cloud-Funktion, um neue Benutzer bei Erstellen automatisch zu deaktivieren, und erstellen Sie einen neuen DB-Eintrag, um deren Zugriff zu verwalten.
Beispiel: MyUsers / {userId} / Access: 0
Aktualisieren Sie Ihre Regeln, um nur Lesevorgänge für Benutzer mit Zugriff> 1 zuzulassen.
Wenn die Listener-Funktion das Konto nicht schnell genug deaktiviert, verhindern die Leseregeln, dass Daten gelesen werden.
quelle
Nachdem ich dies gelesen und einige Nachforschungen über die Möglichkeiten angestellt hatte, kam ich auf einen etwas anderen Ansatz, um die Datennutzung durch nicht autorisierte Benutzer einzuschränken:
Ich speichere meine Benutzer auch in meiner Datenbank (und speichere dort die Profildaten). Also habe ich die DB-Regeln einfach so eingestellt:
Auf diese Weise kann nur ein zuvor gespeicherter Benutzer neue Benutzer zur Datenbank hinzufügen, sodass niemand ohne Konto Vorgänge für die Datenbank ausführen kann. Das Hinzufügen neuer Benutzer ist nur möglich, wenn der Benutzer eine spezielle Rolle hat und nur vom Administrator oder von diesem Benutzer selbst bearbeitet wird (so ähnlich):
quelle
Sie sollten diese Informationen nicht verfügbar machen. in der Öffentlichkeit speziell API-Schlüssel. Dies kann zu einem Datenschutzleck führen.
Bevor Sie die Website veröffentlichen, sollten Sie sie ausblenden. Sie können dies auf zwei oder mehr Arten tun
quelle