向公众公开 Firebase apiKey 是否安全?

2022-08-29 22:35:20

Firebase Web-App指南指出,我应该将给定的放在我的Html中以初始化Firebase:apiKey

// 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

该密钥的目的是什么,它真的意味着公开吗


答案 1

此配置代码段中的代码段仅标识您在 Google 服务器上的 Firebase 项目。有人知道它不是安全风险。实际上,他们必须知道这一点,以便与您的Firebase项目进行交互。每个使用 Firebase 作为其后端的 iOS 和 Android 应用中也都包含相同的配置数据。apiKey

从这个意义上说,它与在同一代码段中标识与项目关联的后端数据库的数据库 URL 非常相似:。请参阅以下问题:为什么这不是安全风险:如何限制 Firebase 数据修改?,包括使用 Firebase 的服务器端安全规则来确保只有授权用户才能访问后端服务。https://<app-id>.firebaseio.com

如果您想了解如何保护对 Firebase 后端服务的所有数据访问权限已获得授权,请阅读有关 Firebase 安全规则的文档。这些规则控制对文件存储的访问和数据库访问,并在 Firebase 服务器上强制执行。因此,无论是您的代码,还是使用您的配置数据的其他人的代码,它都只能执行安全规则允许它执行的操作。

有关 Firebase 将这些值用于哪些目的以及您可以为哪些值设置配额的另一说明,请参阅有关使用和管理 API 密钥的 Firebase 文档。


如果您想降低将此配置数据提交到版本控制的风险,请考虑使用 Firebase Hosting 的 SDK 自动配置。虽然这些键仍然会以相同的格式最终出现在浏览器中,但它们将不再被硬编码到你的代码中。


更新(2021 年 5 月):借助名为 Firebase App Check 的新功能,现在可以将 Firebase 项目中后端服务的访问权限限制为仅来自在该特定项目中注册的 iOS、Android 和 Web 应用的后端服务。

你通常需要将此与上述基于用户身份验证的安全性相结合,以便你有另一个屏障来抵御确实使用你的应用的滥用用户。

通过将 App Check 与安全规则相结合,您既可以针对滥用提供广泛的保护,又可以很好地控制每个用户可以访问的数据,同时仍允许从客户端应用程序代码直接访问数据库。


答案 2

基于 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 引荐来源网址(网站)的请求”中,添加应用的 URL(例如:projectname.firebaseapp.com/* )

现在,该应用程序仅适用于此特定域名。因此,我创建了另一个API密钥,该密钥将专用于本地主机开发。

  1. 单击“> API 密钥创建凭证”

默认情况下,如Emmanuel Campos所述,Firebase仅将本地主机和您的Firebase托管域列入白名单


为了确保我不会错误地发布错误的 API 密钥,我使用以下方法之一在生产中自动使用更受限制的方法。

Create-React-App 的 Setup

在:/env.development

REACT_APP_API_KEY=###dev-key###

在:/env.production

REACT_APP_API_KEY=###public-key###

/src/index.js

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