832 votes

Est-il sûr d'exposer Firebase apiKey au public ?

El Guide Firebase Web-App indique que je devrais mettre le apiKey dans mon Html pour initialiser 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>

Ce faisant, le apiKey est exposé à chaque visiteur.

Quel est le le but de cette clé et est-ce que c'est vraiment destiné à être public ?

1 votes

L'utilisateur Christophe Quintard avait ajouté un lien vers un article très utile contenant des informations supplémentaires sur la sécurité des API Firebase, je le publie donc ici : javebratt.com/hide-firebase-api (Le commentaire va disparaître parce qu'il est attaché à la réponse d'un autre utilisateur qui est signalé pour être supprimé en raison de sa mauvaise qualité).

16 votes

Je tiens simplement à souligner que ce n'est pas parce que ce cadre particulier n'a pas de problème pour exposer son API que les autres cadres sont d'accord. Je ne voudrais pas que quelqu'un sorte de cet article avec l'idée que "c'est bien d'exposer les clés d'API" en général.

4 votes

Vous exposez les clés sans problème. Pour le rendre plus sûr, vous pouvez le restreindre à un domaine spécifique dans la production afin que personne d'autre ne puisse faire un appel API à partir d'un nom de domaine aléatoire. Pour plus de sécurité, supprimez localhost de l'application de production.

947voto

Frank van Puffelen Points 16029

L'apiKey dans cet extrait de configuration identifie simplement votre projet Firebase sur les serveurs de Google. Le fait que quelqu'un la connaisse ne constitue pas un risque pour la sécurité. En fait, il est nécessaire qu'il la connaisse pour qu'il puisse interagir avec votre projet Firebase. Ces mêmes données de configuration sont également incluses dans chaque application iOS et Android qui utilise Firebase comme backend.

En ce sens, elle est très similaire à l'URL de la base de données qui identifie la base de données back-end associée à votre projet dans le même extrait : https://<app-id>.firebaseio.com . Voir cette question pour savoir pourquoi cela ne constitue pas un risque pour la sécurité : Comment restreindre la modification des données de Firebase ? L'utilisation des règles de sécurité côté serveur de Firebase pour garantir que seuls les utilisateurs autorisés peuvent accéder aux services dorsaux.

Si vous voulez apprendre comment sécuriser l'accès à toutes les données de vos services backend Firebase, lisez la documentation sur Règles de sécurité de Firebase . Ces règles contrôlent l'accès au stockage des fichiers et à la base de données, et sont appliquées sur les serveurs Firebase. Ainsi, peu importe si c'est votre ou le code de quelqu'un d'autre qui utilise vos données de configuration, il ne peut faire que ce que les règles de sécurité lui permettent de faire.

Pour une autre explication de ce à quoi Firebase utilise ces valeurs, et pour lesquelles vous peut définir des quotas, voir la documentation de Firebase sur l'utilisation et la gestion des clés API .


Si vous souhaitez réduire le risque de soumettre ces données de configuration au contrôle de version, envisagez d'utiliser la fonction Auto-configuration du SDK pour l'hébergement Firebase . Les clés seront toujours affichées dans le navigateur dans le même format, mais elles ne seront plus codées en dur dans votre code.


Mise à jour (mai 2021) : Grâce à la nouvelle fonctionnalité appelée Firebase App Check Avec la nouvelle version de Firebase, il est désormais possible de limiter l'accès aux services dorsaux de votre projet Firebase aux seuls services provenant des applications iOS, Android et Web enregistrées dans ce projet spécifique.

Vous souhaiterez généralement combiner cette mesure avec la sécurité basée sur l'authentification de l'utilisateur décrite ci-dessus, de manière à disposer d'un autre bouclier contre les utilisateurs abusifs qui faire utiliser votre application.

En combinant App Check et les règles de sécurité, vous disposez à la fois d'une protection étendue contre les abus et d'un contrôle précis des données auxquelles chaque utilisateur peut accéder, tout en permettant un accès direct à la base de données à partir du code de votre application côté client.

16 votes

Cela signifie donc que d'autres personnes seraient en mesure d'accéder à toutes les données de ma base de données firebase ?

0 votes

70 votes

@EmmanuelCampos La réponse est Oui et Non. Oui, si vous autorisez ou voulez que les autres personnes accèdent à toutes les données de la base de données. Et Non, si vous ne voulez pas qu'ils le fassent. La base de données Firebase a des règles, des règles que vous contrôlez.

131voto

now Points 1998

S'appuyant sur les réponses de prufrofro et Frank van Puffelen aquí J'ai mis au point une configuration qui n'empêche pas le scraping, mais qui peut rendre l'utilisation de votre clé API un peu plus difficile.

Attention : Pour obtenir vos données, même avec cette méthode, on peut par exemple simplement ouvrir la console JS dans Chrome et taper :

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

Seules les règles de sécurité de la base de données peuvent protéger vos données.

Néanmoins, j'ai limité l'utilisation de ma clé API de production à mon nom de domaine comme ceci :

  1. https://console.developers.google.com/apis
  2. Sélectionnez votre projet Firebase
  3. Références
  4. Sous Clés API, choisissez votre clé de navigateur. Cela devrait ressembler à ceci : " Clé du navigateur (créée automatiquement par le service Google) "
  5. En " Accepter les demandes provenant de ces référents HTTP (sites web) "Ajoutez l'URL de votre application (exemple : projectname.firebaseapp.com/* )

Maintenant, l'application ne fonctionnera que sur ce nom de domaine spécifique. J'ai donc créé une autre clé API qui sera privée pour le développement sur localhost.

  1. Cliquez sur Créer des informations d'identification > Clé API

Par défaut, comme l'a mentionné Emmanuel Campos, Firebase ne fait que des listes blanches localhost et votre domaine d'hébergement Firebase .


Afin de m'assurer que je ne publie pas la mauvaise clé d'API par erreur, j'utilise l'une des méthodes suivantes pour utiliser automatiquement la clé la plus restreinte en production.

Configuration pour Create-React-App

En /env.development :

REACT_APP_API_KEY=###dev-key###

En /env.production :

REACT_APP_API_KEY=###public-key###

En /src/index.js

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

5 votes

Est-ce que ça marche bien pour vous ? Je pensais faire la même chose pour une application Android. Je me demande pourquoi Firebase ne couvre pas cela dans la section sécurité.

3 votes

Je n'ai eu aucun problème jusqu'à présent, mais probablement pas d'attaques non plus.

5 votes

Cela n'est pas mentionné dans leur guide car cela ne vous protège pas contre le raclage. Tout ce que cela garantit, c'est que quelqu'un d'autre ne peut pas créer une application web qui utilise votre firebase pour lire (ou écrire) des données, si elle est exécutée dans un navigateur normal qui se comporte bien.

39voto

Teoman shipahi Points 7988

Je ne suis pas convaincu d'exposer les clés de sécurité/configuration au client. Je ne dirais pas que c'est sûr, non pas parce que quelqu'un peut voler toutes les informations privées dès le premier jour, mais parce que quelqu'un peut faire des demandes excessives, vider votre quota et vous faire devoir beaucoup d'argent à Google.

Vous devez réfléchir à de nombreux concepts, comme la restriction de l'accès des personnes à des endroits où elles ne sont pas censées se trouver, les attaques DOS, etc.

Je préfèrerais que le client se rende d'abord sur votre serveur web, là vous mettez n'importe quel pare-feu de première main, captcha, cloudflare, sécurité personnalisée entre le client et le serveur, ou entre le serveur et firebase et vous êtes prêt à partir. Au moins, vous pouvez arrêter l'activité suspecte avant qu'elle ne parvienne à Firebase. Vous aurez beaucoup plus de flexibilité.

Je ne vois qu'un seul bon scénario d'utilisation de la configuration basée sur le client pour les usages internes. Par exemple, vous avez un domaine interne, et vous êtes pratiquement sûr que les étrangers ne peuvent pas y accéder, donc vous pouvez configurer un environnement comme navigateur -> type firebase.

16 votes

Mais n'est-ce pas la même chose que d'"exposer" toute autre API REST ? Je veux dire qu'avec une API REST, les URL sont à la disposition des utilisateurs. Ils peuvent utiliser l'URL pour faire toutes les demandes qu'ils veulent et vider votre quota. Ce que Firebase fait, c'est utiliser la configuration avec les clés d'API pour identifier votre partie du backend et c'est et ça doit être disponible pour que l'utilisateur fasse des requêtes.

7 votes

@mbochynski mais vous pouvez en quelque sorte faire des demandes directes aux ressources qui vous font payer la facture. Et du côté de Firebase, il n'y a pas beaucoup de mécanismes de contrôle pour prévenir les attaques DDoS, etc. Ma suggestion serait de laisser votre client appeler votre API REST, mais cette API REST devrait conserver les clés d'API de manière privée, et avant même de toucher les ressources de Firebase, les valider si elles sont des demandes légitimes. (via Cloudflare, etc.) ou récupérer les résultats dans le cache. Ensuite, vous n'utiliserez vos ressources Firebase que si vous en avez besoin. Voici ce que je mettrais en œuvre firebase.google.com/docs/admin/setup

8 votes

Exposer les clés au navigateur est sérieusement une mauvaise idée. ceux qui écrivent tous ces guides/articles, à quoi pensaient-ils ? référent http pour la sécurité ? c'est facilement usurpé.

12voto

bzk Points 211

L'exposition de la clé API crée une vulnérabilité lorsque l'inscription par utilisateur/mot de passe est activée. Il existe un point de terminaison API ouvert qui prend la clé API et permet à quiconque de créer un nouveau compte utilisateur. Il peut ensuite utiliser ce nouveau compte pour se connecter à votre application protégée par Firebase Auth ou utiliser le SDK pour s'authentifier avec un utilisateur/mot de passe et exécuter des requêtes.

J'ai signalé ce problème à Google, mais ils disent que cela fonctionne comme prévu.

Si vous ne pouvez pas désactiver les comptes utilisateur/mot de passe, vous devez procéder comme suit : Créez une fonction cloud pour désactiver automatiquement les nouveaux utilisateurs lors de la création et créez une nouvelle entrée DB pour gérer leur accès.

Ex : MyUsers/{userId}/Access : 0

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

Mettez à jour vos règles pour n'autoriser la lecture que pour les utilisateurs ayant un accès > 1.

Si la fonction d'écoute ne désactive pas le compte assez rapidement, les règles de lecture l'empêcheront de lire toute donnée.

0 votes

De quelle API vous parlez ?

0 votes

@VaibS Firebase Auth REST API firebase.google.com/docs/reference/rest/auth

0 votes

Si nous ne mettons que notre domaine sur la liste blanche, le problème persiste-t-il ?

12voto

JustRaman Points 895

L'EXPOSITION DES CLÉS D'API N'EST PAS UN RISQUE DE SÉCURITÉ MAIS N'IMPORTE QUI PEUT METTRE VOS INFORMATIONS D'IDENTIFICATION SUR SON SITE.

Les clés d'api ouvertes conduisent à des attaques qui peuvent utiliser beaucoup de ressources chez Firebase et qui vous coûteront certainement de l'argent.

Vous pouvez toujours limiter les clés de votre projet Firebase à des domaines / IP.

https://console.cloud.google.com/apis/credentials/key

sélectionnez l'Id et la clé de votre projet et limitez-le à votre application Android/iOs/web.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X