【问题标题】:Firebase email saying my realtime database has insecure rulesFirebase 电子邮件说我的实时数据库有不安全的规则
【发布时间】:2018-12-25 18:51:49
【问题描述】:

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

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

这不是安全规则吗?

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

【问题讨论】:

  • 这可能是因为您在用户登录时允许访问所有数据。您应该只允许登录的用户和公共数据,而不是所有数据。
  • 您还必须指定树级规则。
  • 这些规则看起来不错,您检查过电子邮件来自那个项目吗?
  • @MuruGan 我只有一棵树,所有用户只要经过身份验证,就可以读取和写入这棵树。这就是为什么我的规则是这样写的。
  • 最近 firebase 团队发现,很多项目都存在安全问题,这就是他们向您发送邮件的原因。尝试联系 Firebase 支持团队了解更多详情

标签: firebase firebase-realtime-database firebase-authentication firebase-security


【解决方案1】:

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

https://console.firebase.google.com/subscriptions/project/

【讨论】:

    【解决方案2】:

    firebaser 在这里

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

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

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

    另一方面,如果您在 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 documentation on securing user data

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

    "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 security documentation(和嵌入的视频)了解更多信息。


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

    【讨论】:

    • 我们有{"rules":{".read":"auth != null"}},因为我们没有每个用户的私有数据,只有公共数据。但是我们已经连续几周收到电子邮件说“任何登录的用户都可以阅读您的整个数据库”
    • 嘿乔尼。如果您的规则有意允许公开读取所有数据,您不存储用户数据,并且您愿意为读取所有数据的人支付费用,那么您的规则符合您的预期用途。在这种情况下,电子邮件确实过于嘈杂。目前没有办法禁用它们,因为我们希望确保开发人员意识到他们的规则暴露给用户的潜在风险。您可能希望file a feature request 允许禁用电子邮件,尽管我认为添加该选项为时过早。
    • 谢谢。读取规则适用于数据库中的所有数据。我们有三个顶级“文件夹” - 删除全局读取规则并为三个文件夹中的每一个指定相同的读取规则会有所帮助吗?我想即使我尝试过,直到几周后我才会知道电子邮件是否会停止,因为我认为没有办法测试那个临时(?)。
    • @Jonny 和这里的其他人,最后在警报下有一个开关,您可以使用它来选择退出这些电子邮件。
    • @FrankvanPuffelen 对不起,我的错。原来他们只是在谈论“实时”数据库。我敢打赌,像我这样阅读的人会更多。但是,我的错。
    猜你喜欢
    • 2021-05-16
    • 2022-06-13
    • 2021-02-13
    • 2021-02-11
    • 2019-03-31
    • 2021-12-05
    • 2019-01-30
    相关资源
    最近更新 更多