far*_*mio 368 javascript firebase
在火力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>
Run Code Online (Sandbox Code Playgroud)
通过这样做,apiKey暴露给每个访客.这把钥匙的目的是什么,它真的是公开的吗?
Fra*_*len 361
apiKey基本上只是在Google服务器上识别您的Firebase项目.有人知道这不是安全风险.事实上,他们必须了解它,以便他们与您的Firebase项目进行互动.
从这个意义上讲,它与Firebase历来用于识别后端的数据库URL非常相似:https://<app-id>.firebaseio.com
.请参阅此问题,说明为什么这不是安全风险:如何限制Firebase数据修改?,包括使用Firebase的服务器端安全规则,以确保只有授权用户才能访问后端服务.
now*_*now 63
建立在prufrofro和弗兰克面包车Puffelen的答案在这里,我放在一起这种解决方案并不妨碍刮,但可以使它更难使用您的API密钥.
警告:要获取数据,即使使用此方法,也可以在Chrome中打开JS控制台并键入:
firebase.database().ref("/get/all/the/data").once("value", function (data) {
console.log(data.val());
});
Run Code Online (Sandbox Code Playgroud)
只有数据库安全规则才能保护您的数据.
不过,我将生产API密钥的使用限制在我的域名中,如下所示:
projectname.firebaseapp.com/*
)现在,该应用仅适用于此域名.所以我创建了另一个专用于localhost开发的API密钥.
这个不受限制,所以一定要保密.
我使用Webpack构建我的生产应用程序.为了确保我没有错误地发布这个新的不受限制的API密钥,我把它放在我的内部localhost
,就像你通常使用API密钥一样.然后,在我的/env.development
文件中,我每次都将密钥替换/env.production
为生成版本,如下所示:
REACT_APP_API_KEY=###dev-key###
Run Code Online (Sandbox Code Playgroud)
默认情况下,正如Emmanuel Campos所述,Firebase只有白名单/src/index.js
和您的Firebase托管域名.
Teo*_*ahi 16
我不相信将安全/配置密钥暴露给客户端.我不会称之为安全,不是因为有人可以从第一天起窃取所有私人信息,因为有人可能会提出过多请求,并且会耗尽您的配额并让您欠Google很多钱.
你需要考虑许多概念,限制人们不要访问他们不应该访问的地方,DOS攻击等.
我更希望客户端首先打到你的网络服务器,在那里你把客户端和服务器之间或服务器和firebase之间的第一手防火墙,验证码,云端,自定义安全放在你身边.至少你可以在到达firebase之前先停止可疑活动.你会有更多的灵活性.
我只看到一个使用基于客户端的配置进行内部使用的好用法.例如,您有内部域,并且您非常确定外人无法访问,因此您可以设置浏览器 - > firebase类型等环境.
Jus*_*man 12
API 密钥的暴露并不构成安全风险,但任何人都可以将您的凭据放在他们的网站上。
开放 API 密钥会导致攻击,这些攻击会占用 Firebase 的大量资源,这肯定会花费您的辛苦钱。
您始终可以将 Firebase 项目密钥限制为域/IP。
https://console.cloud.google.com/apis/credentials/key
选择您的项目 ID 和密钥,并将其限制为您的 Android/iOs/web 应用程序。
虽然最初的问题得到了解答(API 密钥可以公开 - 必须根据数据库规则设置数据保护),但我也在寻找一种解决方案来限制对数据库特定部分的访问。因此,在阅读了这篇文章以及一些关于可能性的个人研究后,我想出了一种稍微不同的方法来限制未经授权的用户的数据使用:
我也将我的用户保存在我的数据库中,在相同的 uid 下(并将配置文件数据保存在那里)。所以我只是像这样设置数据库规则:
".read": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()",
".write": "auth != null && root.child('/userdata/'+auth.uid+'/userRole').exists()"
Run Code Online (Sandbox Code Playgroud)
这样,只有以前保存的用户才能在数据库中添加新用户,因此没有帐户的任何人都无法对数据库进行操作。
此外,仅当用户具有特殊角色并且只能由管理员或该用户本身进行编辑时才可以添加新用户(如下所示):
"userdata": {
"$userId": {
".write": "$userId === auth.uid || root.child('/userdata/'+auth.uid+'/userRole').val() === 'superadmin'",
...
Run Code Online (Sandbox Code Playgroud)
可以包含它们,并且仅在 Firebase ML 或使用 Firebase 身份验证时才需要特别小心
Firebase 的 API 密钥与典型的 API 密钥不同:与 API 密钥的通常使用方式不同,Firebase 服务的 API 密钥不用于控制对后端资源的访问;这只能通过 Firebase 安全规则来完成。通常,您需要严格保护 API 密钥(例如,通过使用保管库服务或将密钥设置为环境变量);但是,Firebase 服务的 API 密钥可以包含在代码或签入的配置文件中。
尽管 Firebase 服务的 API 密钥可以安全地包含在代码中,但在某些特定情况下,您应该对 API 密钥实施限制;例如,如果您使用 Firebase ML 或通过电子邮件/密码登录方法使用 Firebase 身份验证。稍后在本页了解有关这些案例的更多信息。
更多信息请查看 官方文档
当启用用户/密码注册时,API 密钥暴露会产生一个漏洞。有一个开放的 API 端点,它接受 API 密钥并允许任何人创建新的用户帐户。然后,他们可以使用这个新帐户登录受 Firebase 身份验证保护的应用程序,或使用 SDK 使用用户/密码进行身份验证并运行查询。
我已经向谷歌报告了这个问题,但他们说它按预期工作。
如果您不能禁用用户/密码帐户,您应该执行以下操作: 创建一个云功能以在创建时自动禁用新用户并创建一个新的数据库条目来管理他们的访问。
例如:MyUsers/{userId}/Access: 0
exports.addUser = functions.auth.user().onCreate(onAddUser);
exports.deleteUser = functions.auth.user().onDelete(onDeleteUser);
Run Code Online (Sandbox Code Playgroud)
更新您的规则,只允许访问权限大于 1 的用户读取。
如果侦听器功能没有足够快地禁用帐户,则读取规则将阻止它们读取任何数据。
我相信一旦数据库规则写得准确,就足以保护您的数据。此外,还可以遵循一些准则来相应地构建数据库。比如在users下做一个UID节点,把所有的信息放在它下面。之后,您将需要实现一个简单的数据库规则,如下所示
"rules": {
"users": {
"$uid": {
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
其他用户将无法读取其他用户的数据,而且域策略将限制来自其他域的请求。人们可以在Firebase 安全规则上阅读更多相关信息
归档时间: |
|
查看次数: |
75809 次 |
最近记录: |