Firebase电子邮件说我的实时数据库有不安全的规则

zzzyeukh  于 2023-03-24  发布在  其他
关注(0)|答案(3)|浏览(162)

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

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

这难道不是一个安全的规则吗?
电子邮件/密码是我启用的唯一登录方法。

vmdwslir

vmdwslir1#

  • 这里是火战士 *

很抱歉,邮件中没有明确说明这些规则的不安全之处。保护用户数据是任何应用程序的关键一步,因此我将在下面详细解释如何操作。
您的(默认)规则允许任何登录到后端的人对整个数据库进行完全读/写访问。这只是一个非常基本的安全层。
一方面,这比仅仅授予每个人访问数据库的权限更安全,至少他们必须登录。
另一方面,如果您在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来限制仅来自您网站或应用程序的呼叫的访问。这是另一种快速减少数据库滥用的方法。但这种方法并不是万无一失的,因此您需要合并应用程序检查用于广泛保护,并结合安全规则进行细粒度控制。

3hvapo4f

3hvapo4f2#

您也可以通过访问电子邮件底部的链接来静音警报。
https://console.firebase.google.com/subscriptions/project/<YOUR_PROJECT_NAME>

x4shl7ld

x4shl7ld3#

我改变了规则

{
  "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"
      }
    }
  }
}

但在此之后,页面不工作。

相关问题