Firebase Web-App指南指出,我应该把给定的apiKey放在我的Html来初始化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>

这样,apiKey就暴露给了每个访问者。

这个密钥的目的是什么?它真的是要公开的吗?


当前回答

暴露API密钥并不存在安全风险,但任何人都可以将您的凭据放在他们的站点上。

开放api密钥会导致攻击,可以在firebase上使用大量资源,这肯定会花费你的硬通货。

你总是可以限制你的firebase项目密钥的域名/ IP。

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

选择您的项目Id和密钥,并限制它为您的Android/iOs/web应用程序。

其他回答

我相信,一旦数据库规则被准确地编写出来,就足以保护您的数据。此外,还可以遵循一些指导原则来相应地构建数据库。例如,在用户下创建UID节点,并将所有信息放在该节点下。之后,您需要实现一个简单的数据库规则,如下所示

  "rules": {
    "users": {
      "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
      }
    }
  }
}

其他用户将无法读取其他用户的数据,此外,域策略将限制来自其他域的请求。 你可以在上面读到更多 Firebase安全规则

当启用用户/密码注册时,API密钥暴露会产生漏洞。有一个开放的API端点,它接受API密钥,并允许任何人创建一个新的用户帐户。然后,他们可以使用这个新帐户登录到受Firebase Auth保护的应用程序,或使用SDK进行user/pass认证并运行查询。

我已经向谷歌报告了这一点,但他们说它正在按照预期工作。

如果您不能禁用用户/密码帐户,您应该执行以下操作: 创建一个云函数来自动禁用新用户onCreate,并创建一个新的DB条目来管理他们的访问。

Ex: MyUsers/ (userId) /Access: 0

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

更新规则,只允许访问> 1的用户读取。

监听器函数没有足够快地禁用帐户,那么读取规则将阻止他们读取任何数据。

这个配置片段中的apiKey仅标识谷歌服务器上的Firebase项目。让别人知道它不会有安全风险。事实上,为了让他们与您的Firebase项目进行交互,让他们知道这一点是必要的。同样的配置数据也包含在所有使用Firebase作为后端的iOS和Android应用程序中。

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

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

有关Firebase使用这些值的另一个解释,以及可以为其中哪些设置配额,请参阅Firebase关于使用和管理API密钥的文档。


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


更新(2021年5月):多亏了名为Firebase App Check的新功能,现在实际上可以限制对Firebase项目中后端服务的访问,只允许来自特定项目中注册的iOS、Android和Web应用程序。

通常情况下,你需要将其与上面描述的基于用户身份验证的安全性结合起来,这样你就有了另一个盾牌,可以防止滥用你的应用程序的用户。

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

您不应该公开此信息。在公共场合,特别是API密钥。 这可能会导致隐私泄露。

在公开网站之前,你应该隐藏它。你可以用两种或更多的方法来做

复杂的编码/隐藏 只需将firebase SDK代码放在您的网站或应用程序的底部,从而firebase自动完成所有工作。你不需要把API键放在任何地方

我正在github页面上做一个博客网站。我有一个想法,在每个博客页面的末尾嵌入评论。我知道firebase是如何获取和提供数据的。

我已经用项目甚至控制台测试了很多次。我完全不同意vlit是脆弱的这句话。 相信我,如果你遵循了firebase建议的隐私保护步骤,公开显示你的api密钥是没有问题的。 访问https://console.developers.google.com/apis 而且还是从安保部门来的。