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

2020/09/26 02:21 · javascript ·  · 0评论

火力地堡web应用指南规定我应该把给定的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来,每个访问者都可以接触到。该密钥的目的是什么,真的意味着要公开吗?

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

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

如果您想了解如何确保所有对Firebase后端服务的数据访问均得到授权,请阅读有关Firebase安全规则的文档


如果您想降低将此配置数据提交到版本控制的风险,请考虑使用Firebase HostingSDK自动配置尽管密钥仍会以相同的格式出现在浏览器中,但是它们不再被硬编码到您的代码中。

这里基于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 Service自动创建)
  5. 在“ 接受来自这些HTTP参照请求(网站) ”中,增加您的应用程序的URL(为例:projectname.firebaseapp.com/*

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

  1. 点击创建凭据> API密钥

默认情况下,如Emmanuel Campos所述,Firebase仅将白名单localhost和Firebase托管域列入白名单


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

建立反应应用程式

/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,
  // ... 
};

我不相信将安全性/配置密钥公开给客户端。我不会将其称为安全的原因,不是因为有人可以从第一天起就窃取所有私人信息,因为有人会提出过多要求,耗尽您的配额,并使您欠Google很多钱。

您需要考虑许多概念,包括限制人们不要访问不应在的地方,DOS攻击等。

我更希望客户端首先连接到您的Web服务器,在那里您将第一手防火墙,验证码,cloudflare,自定义安全性放在客户端和服务器之间,或者服务器和firebase之间,您就可以使用了。至少您可以先停止可疑活动,直到其到达火力基地。您将拥有更大的灵活性。

我只看到一种很好的使用场景,可以将基于客户端的配置用于内部使用。例如,您具有内部域,并且您可以肯定外部人员无法访问该域,因此可以设置浏览器-> firebase类型之类的环境。

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

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

其他用户将无法读取其他用户的数据,而且,域策略将限制来自其他域的请求。可以阅读有关Firebase安全性规则的更多信息

启用用户/密码注册后,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的用户读取。

偶然的情况下,侦听器功能无法足够快地禁用帐户,然后读取规则将阻止它们读取任何数据。

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

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

".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'",
   ...

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

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

  1. 复杂的编码/隐藏
  2. 只需将firebase SDK代码放在您网站或应用程序的底部,firefire即可自动完成所有工作。您不需要将API密钥放在任何地方
本文地址:http://javascript.askforanswer.com/xianggongzhonggongkaifirebase-apikeyshifouanquan.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!