web-dev-qa-db-ja.com

Firebase apiKeyを一般に公開しても安全ですか?

firebaseウェブアプリガイド は、firebaseを初期化するために、与えられたapiKeyを私の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>

そうすることによってapiKeyはすべての訪問者に公開されます。その鍵の目的は何ですか?それは本当に公開されることを意味していますか?

303
farmio

ApiKeyは、基本的にはGoogleサーバー上のFirebaseプロジェクトを識別するだけのものです。誰かがそれを知ることはセキュリティ上のリスクではありません。実際、Firebaseプロジェクトとやり取りするには、知っている必要があります。

その意味では、Firebaseがバックエンドを識別するために歴史的に使用されてきたデータベースのURLと非常によく似ています:https://<app-id>.firebaseio.com。なぜこれがセキュリティ上のリスクとならないかについては、次の質問を参照してください。 Firebaseのデータ変更を制限する方法 、許可されたユーザーのみがバックエンドサービスにアクセスできるようにするためのFirebaseのサーバー側セキュリティルールの使用を含む。

282

PrufrofroとFrank van Puffelenの答えを基にして ここ この解決策をまとめると、スクレイピングを防ぐことはできませんが、APIキーを使用するのが難しくなります。

警告:この方法でもデータを取得するには、たとえばChromeでJSコンソールを開いて次のように入力します。

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

データベースセキュリティルールのみがデータを保護できます。

それにもかかわらず、私は本番APIキーの使用をこのように私のドメイン名に制限しました:

  1. https://console.developers.google.com/apis
  2. Firebaseプロジェクトを選択してください
  3. 資格情報
  4. APIキーの下で、ブラウザキーを選択します。 「ブラウザキー(Googleサービスにより自動作成)」のようになります。
  5. "これらのHTTPリファラー(Webサイト)からのリクエストを受け付ける"に、アプリのURLを追加してください(例:projectname.firebaseapp.com/*

今すぐアプリはこのドメイン名でのみ動作します。それで私はlocalhost開発のために秘密になるであろう別のAPIキーを作成しました。

  1. 認証情報の作成> APIキーをクリックします。

これは制限されていませんので、必ず非公開にしてください。

Webpackを使って本番用アプリを作成します。この新しい無制限のAPIキーを誤って公開しないようにするために、通常のAPIキーと同じようにそれをindex.htmlの中に入れます。それから、webpack.production.config.jsファイルの中で、index.htmlがプロダクションビルドにコピーされるたびにキーを置き換えます。

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

Emmanuel Camposが述べたように、デフォルトでは FirebaseのみがホワイトリストlocalhostとあなたのFirebaseホスティングドメイン

54
now

私はsecurity/configキーをクライアントに公開することを確信していません。誰かが過度の要求をし、あなたのクォータを流出させ、あなたにグーグルに大金を借りさせることができるので、私はそれを安全とは呼びません。

あなたは、人々が彼らがそうであるべきではないと思われるところにアクセスしないように制限することから多くの概念について考える必要があります、DOS攻撃など。

クライアントが最初にあなたのWebサーバーにぶつかるのであれば、クライアントとサーバーの間、あるいはサーバーとfirebaseの間にファイアウォール、キャプチャ、クラウドフレア、カスタムセキュリティを直接置くことになるでしょう。少なくとも、あなたが最初に疑わしい活動を停止してからFirebaseに到達することができます。もっと柔軟性があります。

内部使用のためにクライアントベースの設定を使用するための良い使用法シナリオは1つしかありません。たとえば、内部ドメインがあり、部外者がそこにアクセスできないと確信しているので、ブラウザ - > firebaseタイプのような環境を設定できます。

12
Teoman shipahi