32

我最近收到一封来自 firebase 的电子邮件,告诉我我的实时数据库有不安全的规则。这些是我制定的规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
 }
}

这不是一个安全的规则吗?

电子邮件/密码是我启用的唯一登录方法。

4

2 回答 2

66

火力基地在这里

如果电子邮件没有明确说明这些规则的不安全之处,我深表歉意。对于您提供的任何应用程序而言,保护用户数据的安全都是至关重要的一步,因此我将尝试在下面详细解释其工作原理。

您拥有的(默认)规则允许登录到您的后端的任何人对整个数据库进行完全读/写访问。这只是一个非常基本的安全层。

一方面,这比授予每个人访问您的数据库的权限更安全,至少他们必须登录。

另一方面,如果您在 Firebase 身份验证中启用任何身份验证提供程序,任何人都可以登录您的后端,即使不使用您的应用也是如此。根据提供者的不同,这可以像在浏览器的开发者控制台中运行一点 JavaScript 一样简单。一旦他们登录,他们就可以在您的数据库中读取和写入任何内容。这意味着他们可以使用简单的命令删除所有数据,例如firebase.database().ref().delete().

为了使数据访问更加安全,您需要更严格地控​​制每个登录用户可以执行的操作。例如,假设您保留了一份个人资料,其中包含每个用户的信息/users。您可能希望允许所有用户访问这些配置文件,但您肯定希望只允许用户修改他们自己的数据。您可以使用以下规则来保护它:

{
  "rules": {
    "users": {
      ".read": true,
      "$user_id": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($user_id)
        ".write": "$user_id === auth.uid"
      }
    }
  }
}

使用这些规则,每个人(甚至是未经身份验证的用户)都可以阅读所有配置文件。但是每个配置文件只能由其配置文件所在的用户修改。有关这方面的更多信息,请参阅Firebase 文档保护用户数据

除了确保对数据的所有访问都获得授权之外,您还需要确保存储的所有数据对于您为应用程序设置的任何规则都是有效的。例如,假设您想为用户存储两个属性:他们的姓名和年龄(仅出于示例的目的,实际上您可能会存储他们的出生日期)。因此,您可以将其存储为:

"users": {
  "uidOfPuf": {
    "name": "Frank van Puffelen",
    "age": 48
  }
}

为确保只能写入此数据,您可以使用以下规则:

{
  "rules": {
    "users": {
      ".read": true,
      "$user_id": {
        ".write": "$user_id === auth.uid",
        ".validate": "data.hasChildren('name', 'age')",
        "name": {
          ".validate": "data.isString()",
        },
        "age: {
          ".validate": "data.isNumber()",
        },
        "$other: {
          ".validate": false
        }
      }
    }
  }
}

这些规则确保每个用户配置文件都有一个nameage属性,分别具有字符串和数值。如果有人尝试写入任何其他属性,则写入将被拒绝。

以上是关于如何考虑保护您(用户)数据的快速入门。我建议您查看Firebase 安全文档(和嵌入式视频)了解更多信息。


更新:自 2021 年 5 月起,您还可以使用Firebase 应用检查来限制对仅来自您的网站或应用的呼叫的访问。这是减少数据库滥用的另一种快速方法。不过,这种方法并非万无一失,因此您需要将广泛保护的 App Check 与细粒度控制的安全规则结合起来。

于 2018-07-18T04:09:33.080 回答
5

您还可以通过访问电子邮件底部的链接来静音警报。

https://console.firebase.google.com/subscriptions/project/ <YOUR_PROJECT_NAME>

在此处输入图像描述

于 2021-10-27T09:41:24.867 回答