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就暴露给了每个访问者。

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


当前回答

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

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

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

其他回答

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

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

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

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

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

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

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

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

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

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

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

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

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

虽然最初的问题得到了回答(api密钥可以暴露-数据的保护必须从DB规则中设置),但我也在寻找一种解决方案来限制对DB特定部分的访问。 所以在阅读了这篇文章和一些关于可能性的个人研究之后,我想出了一个稍微不同的方法来限制未经授权的用户使用数据:

我也在我的数据库中保存我的用户,在相同的uid下(并在那里保存配置文件数据)。所以我只是像这样设置db规则:

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

这样,只有以前保存的用户才能在DB中添加新用户,因此没有帐户的人无法对DB进行操作。

此外,只有当用户具有特殊角色并且只能由管理员或该用户自己编辑时,才可以添加新用户(就像这样):

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