向公众公开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:
- https://console.developers.google.com/apis
- select您的Firebase项目
- 证书
- 在API密钥下,select您的浏览器密钥。 它应该看起来像这样:“ 浏览器键(由Google服务自动创build) ”
- 在“ 接受来自这些HTTP引用者(网站)的请求 ”中,添加您的应用的URL(例如:
projectname.firebaseapp.com/*
)
现在,该应用只能在这个域名上工作。 所以我创build了另一个API,这个API将是localhost开发的私有的。
- 点击创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。