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

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就暴露给每个访问者。 这个钥匙的目的是什么?它真的是公开的吗?

apiKey实质上标识了您的Firebase项目。 有人知道这不是安全风险。 实际上,为了让他们与您的Firebase项目互动,他们有必要了解它。

从这个意义上说,它与Firebase历史上用于识别后端的数据库URL非常相似: https://<app-id>.firebaseio.com 。 看看这个问题为什么这不是一个安全风险: 如何限制Firebase数据修改?

基于prufrofro和Frank van Puffelen 在这里的答案,我把这个解决scheme放在一起,不会阻止刮擦,但是可以使得使用API​​ key更加困难。

为了得到你的数据,即使使用这种方法,你也可以简单地在Chrome中打开JS控制台,然后键入:

 firebase.database().ref("/get/all/the/data").once("value", function (data) { console.log(data.val()); }); 

只有数据库安全规则才能保护你的数据。

不过,我这样限制了我的产品API Key:

  1. https://console.developers.google.com/apis
  2. select您的Firebase项目
  3. 证书
  4. 在API密钥下,select您的浏览器密钥。 它应该看起来像这样:“ 浏览器键(由Google服务自动创build)
  5. 在“ 接受来自这些HTTP引用者(网站)的请求 ”中,添加您的应用的URL(例如: projectname.firebaseapp.com/*

现在,该应用只能在这个域名上工作。 所以我创build了另一个API,这个API将是localhost开发的私有的。

  1. 点击创build凭证> API密钥

这一个不受限制,所以确保你保持私密。

我使用Webpack来构build我的制作应用程序。 为了确保我不会错误地发布这个新的不受限制的API密钥,我把它放在我的index.html ,就像你通常用你的API密钥一样。 然后,在我的webpack.production.config.js文件中,每次将index.html复制到生产版本中时,都会replace该键,如下所示:

 plugins: [ new CopyWebpackPlugin([ { transform: function(content, path) { return content.toString().replace("###dev-key###", "###public-key###"); }, from: './index.html' } ]) ] 

默认情况下,如Emmanuel Campos所述, Firebase仅将localhost和您的Firebase托pipe域名白名单 。

我不相信将安全/configuration密钥公开给客户端。 我不会把它叫做安全的,不是因为有人可以从第一天就偷走所有私人信息,因为有人可以提出过多的要求,并且耗尽你的配额,让你欠Google很多钱。

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

我更喜欢客户端首先会打到你的Web服务器,在那里你把什么第一手防火墙,captcha,cloudflare,定制安全在客户端和服务器之间,或者服务器和firebase之间,你很好去。 至less您可以先将可疑活动停在火力点之前。 你会有更多的灵活性。

我只看到一个很好的使用场景,使用基于客户端的configuration内部使用。 例如,你有内部域名,你很确定外部人员不能访问那里,所以你可以设置环境,如浏览器 – > firebasetypes。