我是Firebase的新手,如果这是一个愚蠢的问题,我们深表歉意。 Firebase不断向我发送以下声明的电子邮件:
我们检测到您的安全规则存在以下问题:
- 任何用户都可以读取您的整个数据库
- 任何登录的用户都可以写入您的整个数据库
我的应用程序是一个玩耍的游戏,并且不要求用户登录(完全没有用户输入),因此我无法使用我在此处发布的类似问题中推荐的userID规则。
我不介意任何人都可以读取我的数据库,但是,我想设置一个权限,以便我是唯一拥有对该数据库写访问权限的人。
鉴于我无法使用userID权限,如何更改数据库设置,使其成为唯一能够对其进行写操作的人?
答案 0 :(得分:1)
如果仅从自己的开发计算机设置数据,请考虑使用Admin SDK。该SDK使用管理权限访问后端,因此绕过了安全规则。这意味着您可以拥有以下规则:
{
"rules": {
".read": true,
".write": false
}
}
即使在匿名登录用户之前,创建应用程序管理页面(通常是简单的StackBlitz或JSBin)时,我通常要做的第一步就是匿名登录自己,登录我的UID,然后仅授予写权限到我的UID。
规则类似于:
{
"rules": {
".read": true,
".write": "auth.uid === 'myUid'"
}
}
以后,如果我扩大了用户登录范围(即使仅再次针对其他管理员),我也会对此进行更详尽的检查,例如:
{
"rules": {
".read": true,
".write": "auth.uid === 'myUid' ||
(auth.token.email_verified == true &&
auth.token.email.matches(/.*@google.com$/))"
}
}
使用上述所有规则,您仍然会收到有关用户读取整个数据库的能力的警告。顶级".read": true
的主要问题在于,它允许通过单个HTTP GET到https://yourproject.firebaseio.com/.json
来抓取您的网站。有很多脚本可以用来查找用户信息
如果您的应用无关,可以在此时禁用警报。
如果需要 ,可以考虑通过在规则中编码访问模式来保护数据。
例如,如果您有一个顶级节点包含所有游戏的列表,然后又有一个顶级节点包含每个游戏的移动,则可以将读取权限降低到这些级别:
{
"rules": {
"games": {
".read": true,
},
"moves": {
"$gameid": {
".read": true
}
}
}
}
这种结构,任何人都可以阅读游戏的完整列表。但是当时只能读取单个游戏的动作。这与一个应用程序相匹配,在该应用程序中,您首先看到游戏列表,然后查看所选游戏的动作。
使用这些规则,用户仍然有权访问所有数据,但前提是它们必须遵循应用程序的规则。而且(也许更重要的是)公然的顶级https://yourproject.firebaseio.com/.json
访问将不再起作用。