实时数据库从不安全到安全规则,无需中断服务
Realtime Database from insecure to secure rules without interrupting services
今天,我收到一封电子邮件,其中指出,
[Firebase] Your Realtime Database 'CC-default-rtdb' has insecure rules, any user can read your entire database, any user can write to your entire database
我的服务器每天运行以将值存储在实时数据库中。当我开始这个Firebase项目时,我使用了基本的读写规则。
{
"rules": {
".read": true,
".write": true
}
}
如果我现在更改规则,是否会影响我的外部 Node.JS 服务器将值存储到实时数据库中?
我什至从手机应用程序访问这个数据库,如果规则改变,是否会影响移动应用程序读取数据?
如何在不中断对外部服务器和移动应用程序的访问的情况下保护这些实时数据库规则(从 public 到私有)?重要的是,我的外部服务器访问不得中断。
如果您通过身份验证(登录)访问您的数据库,您可以将您的节点设置为 auth!=null
,这样任何未经授权的用户都无法访问它们。
您需要按照以下步骤操作:
- 将需要公开的所有节点的读取设置为 true
- 将您想要提供给任何授权用户的所有节点的 read/write 设置为
auth!=null
- 为需要特殊访问权限的任何节点设置自定义验证规则(例如:用户只能写入 his/her 数据)
根据屏幕截图,如果有人掌握了您的项目 ID,他们就可以修改并窃取您的整个数据库。
您需要以适合您的用例的方式设置规则。据我了解:
- 允许外部服务器帐户访问整个数据库
- 允许移动应用有条件访问(也许是用户?)
例子
以这个数据库为例:
{
"top_level": {
"users": [
{
"username": "X",
"userId": "0"
},
{
"username": "Y",
"userId": "1"
}
],
"public_data": {
"news": [
{
"title": "X",
"body": "Y"
}
]
}
}
}
我要设置:
- 节点“新闻”公开阅读(无授权)
- 节点“用户”仅供其他登录用户阅读(授权)
- 节点“users”的子节点仅对 ID 与节点中的值
userId
匹配的用户可写
在这种情况下,规则是:
{
"rules": {
".read": false,
".write": false,
"top_level": {
"users": {
".read": "auth!=null",
"$user_id": {
".write": "auth!=null && data.child('userId').val()===auth.uid"
}
},
"news" : {
".read":true
}
}
}
}
请注意,在顶层设置为 true 的规则会覆盖内部规则。
如果您需要说明,请发表评论。
今天,我收到一封电子邮件,其中指出,
[Firebase] Your Realtime Database 'CC-default-rtdb' has insecure rules, any user can read your entire database, any user can write to your entire database
我的服务器每天运行以将值存储在实时数据库中。当我开始这个Firebase项目时,我使用了基本的读写规则。
{
"rules": {
".read": true,
".write": true
}
}
如果我现在更改规则,是否会影响我的外部 Node.JS 服务器将值存储到实时数据库中?
我什至从手机应用程序访问这个数据库,如果规则改变,是否会影响移动应用程序读取数据?
如何在不中断对外部服务器和移动应用程序的访问的情况下保护这些实时数据库规则(从 public 到私有)?重要的是,我的外部服务器访问不得中断。
如果您通过身份验证(登录)访问您的数据库,您可以将您的节点设置为 auth!=null
,这样任何未经授权的用户都无法访问它们。
您需要按照以下步骤操作:
- 将需要公开的所有节点的读取设置为 true
- 将您想要提供给任何授权用户的所有节点的 read/write 设置为
auth!=null
- 为需要特殊访问权限的任何节点设置自定义验证规则(例如:用户只能写入 his/her 数据)
根据屏幕截图,如果有人掌握了您的项目 ID,他们就可以修改并窃取您的整个数据库。
您需要以适合您的用例的方式设置规则。据我了解:
- 允许外部服务器帐户访问整个数据库
- 允许移动应用有条件访问(也许是用户?)
例子
以这个数据库为例:
{
"top_level": {
"users": [
{
"username": "X",
"userId": "0"
},
{
"username": "Y",
"userId": "1"
}
],
"public_data": {
"news": [
{
"title": "X",
"body": "Y"
}
]
}
}
}
我要设置:
- 节点“新闻”公开阅读(无授权)
- 节点“用户”仅供其他登录用户阅读(授权)
- 节点“users”的子节点仅对 ID 与节点中的值
userId
匹配的用户可写
在这种情况下,规则是:
{
"rules": {
".read": false,
".write": false,
"top_level": {
"users": {
".read": "auth!=null",
"$user_id": {
".write": "auth!=null && data.child('userId').val()===auth.uid"
}
},
"news" : {
".read":true
}
}
}
}
请注意,在顶层设置为 true 的规则会覆盖内部规则。 如果您需要说明,请发表评论。