将Firebase apiKey暴露给公众是否安全?

时间:2016-05-27 11:30:21

标签: javascript firebase

firebase Web-App guide状态我应该将给定的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会暴露给每个访问者。这个密钥的目的是什么,它真的是公开的吗?

9 个答案:

答案 0 :(得分:286)

apiKey基本上只是在Google服务器上识别您的Firebase项目。有人知道这不是安全风险。事实上,他们必须了解它,以便他们与您的Firebase项目进行互动。

从这个意义上讲,它与Firebase历来用于识别后端的数据库URL非常相似:https://<app-id>.firebaseio.com。请参阅此问题,了解为何不存在安全风险:How to restrict Firebase data modification?,包括使用Firebase的服务器端安全规则,以确保只有授权用户才能访问后端服务。

答案 1 :(得分:13)

我不相信将安全/配置密钥暴露给客户端。我不会称之为安全,不是因为有人可以从第一天起窃取所有私人信息,因为有人可能会提出过多请求,并且会耗尽您的配额并让您欠Google很多钱。

你需要考虑许多概念,限制人们不要访问他们不应该访问的地方,DOS攻击等。

我更希望客户端首先点击你的网络服务器,在那里你把第一手防火墙,验证码,云端,自定义安全放在客户端和服务器之间,或者服务器和firebase之间,你很高兴去。至少你可以在到达firebase之前先停止可疑活动。你会有更多的灵活性。

我只看到一个使用基于客户端的配置进行内部使用的好用法。例如,您有内部域,并且您非常确定外人无法访问,因此您可以设置类似浏览器的环境 - &gt; firebase类型。

答案 2 :(得分:6)

我相信,只要正确编写数据库规则,就足以保护您的数据。而且,有一些指南可供您遵循以相应地构建数据库。例如,在用户下创建一个UID节点,并将所有信息置于其下。之后,您将需要实现一个简单的数据库规则,如下所示

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

其他用户将无法读取其他用户的数据,而且,域策略将限制来自其他域的请求。 可以阅读更多有关它的内容 Firebase Security rules

答案 3 :(得分:3)

在阅读本文并研究了可能性之后,我想出了一种略有不同的方法来限制未经授权的用户使用数据:

我也将用户保存在数据库中(并在其中保存配置文件数据)。所以我只是这样设置数据库规则:

".read": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()",
".write": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()"

这样,只有以前保存的用户才能在数据库中添加新用户,因此没有帐户的任何人都无法对数据库进行操作。仅当该用户具有特殊角色并且仅通过admin或该用户本身进行编辑时,才可以添加新用户(类似这样):

"userdata": {
  "$userId": {
    ".write": "$userId === auth.uid || root.child('/userdata/'+auth.uid+'/userRole').val() === 'superadmin'",
   ...

答案 4 :(得分:2)

可以包含它们,只有在 Firebase ML 或使用 Firebase 身份验证时才需要特别注意

<块引用>

Firebase 的 API 密钥与典型的 API 密钥不同: 与通常使用 API 密钥的方式不同,Firebase 服务的 API 密钥不用于控制对后端资源的访问;这只能通过 Firebase 安全规则来完成。通常,您需要严格保护 API 密钥(例如,通过使用保管库服务或将密钥设置为环境变量);但是,Firebase 服务的 API 密钥可以包含在代码或签入的配置文件中。

<块引用>

虽然 Firebase 服务的 API 密钥可以安全地包含在代码中,但在某些特定情况下,您应该对 API 密钥实施限制;例如,如果您使用 Firebase ML 或通过电子邮件/密码登录方法使用 Firebase 身份验证。稍后在此页面上详细了解这些案例。

有关详细信息,请查看 the offical docs

答案 5 :(得分:0)

启用用户/密码注册后,API密钥公开会产生漏洞。有一个开放的API端点,该端点具有API密钥,并允许任何人创建新的用户帐户。然后,他们可以使用此新帐户登录到受Firebase Auth保护的应用程序,或使用SDK通过用户/通过身份验证并运行查询。

我已将此报告给Google,但他们说它正在按预期工作。

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

例如:MyUsers / {userId} /访问权限:0

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

更新您的规则,以仅允许具有> 1的访问权限的用户进行读取。

在不太可能的情况下,侦听器功能无法足够快地禁用帐户,因此读取规则将阻止它们读取任何数据。

答案 6 :(得分:0)

API密钥的暴露并不是安全风险,但是任何人都可以在其网站上放置您的凭据。

打开api键会导致攻击,这些攻击会在firebase上占用大量资源,这肯定会花费您的辛苦钱。

您始终可以将Firebase项目密钥限制为域/ IP。

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

选择您的项目ID和密钥,并将其限制为您的Android / iOs /网络应用。

答案 7 :(得分:-1)

我正在 github 页面上制作一个博客网站。我有一个想法在每个博客页面的末尾嵌入评论。我了解 firebase 如何获取并为您提供数据。

我已经用项目甚至使用控制台进行了多次测试。我完全不同意 vlit 易受攻击的说法。 相信我,如果您遵循了 firebase 推荐的隐私步骤,那么公开显示您的 api 密钥是没有问题的。 转到https://console.developers.google.com/apis 并执行安全设置。

答案 8 :(得分:-11)

您不应公开此信息。在公共场合,尤其是api键。 这可能会导致隐私泄露。

在公开网站之前,您应该将其隐藏。您可以通过2种或更多方式进行操作

  1. 复杂的编码/隐藏
  2. 只需将Firebase SDK代码放在您的网站或应用程序的底部,即可使Firebase自动完成所有工作。您不需要将API密钥放在任何地方