【问题标题】:What do these default security rules for the Firebase Realtime Database mean?Firebase 实时数据库的这些默认安全规则是什么意思?
【发布时间】:2021-07-28 05:01:22
【问题描述】:

我在 Firebase 上创建了一个新项目,并在其中创建了一个实时数据库。当被问及我的数据库的安全规则时,我选择了Start in test mode

现在我的数据库在 Firebase 控制台中的安全规则显示为:

{
  "rules": {
    ".read": "now < 1622790000000",  // 2021-6-4
    ".write": "now < 1622790000000",  // 2021-6-4
  }
}

这些规则是什么意思?我怎样才能将它们更改为更安全?

【问题讨论】:

    标签: firebase-realtime-database firebase-security


    【解决方案1】:
    推荐的答案 Google Cloud

    这些默认测试模式规则是一个简单的包罗万象的规则,允许世界上的每个人在给定日期之前读取和写入您的数据库。

    让我们分解规则,看看它们是如何工作的:

    1. 紧接在"rules" 下的".read"".write" 节点决定了谁可以读取/写入整个数据库中的数据。

    2. now variable 由 Firebase 自动设置为服务器上的当前时间。此值位于 milliseconds since the epoch 中,这是在 Firebase 中也存储时间戳的推荐值。

    3. 规则中的1622790000000 值是未来某个时间点的时间戳。让我们以更易读的日期格式看看这个值是什么:

         console.log(new Date(1622790000000))
      
        

      “2021-06-04T07:00:00.000Z”

    因此,在 2021 年 6 月 4 日之前,任何人都可以读写我们数据库中的所有数据。在此日期之后,任何人都无法再使用客户端 SDK 访问这些数据。 Firebase Admin SDKs 完全绕过这些规则,因此它们不受影响。


    我可以延长时间吗?

    您可能从 Firebase 收到这样的消息:

    您选择在测试模式下开始开发,这会使您的实时数据库实例完全对 Internet 开放。由于此选择使您的应用容易受到攻击者的攻击,因此您的数据库安全规则配置为在前 30 天后停止允许请求。 5 天后,所有客户端对您的实时数据库实例的请求都将被拒绝。

    此消息表示由于您的安全规则中的时间戳,对您数据的访问权即将到期。

    实际上很容易将测试模式延长到另一个截止日期。您需要做的就是更改 1622790000000 值。例如,要延长到 7 月 4 日,我可以将值设置为 1625382000000

    为了确定要使用的值,我运行了这个小小的 JavaScript sn-p:

       console.log(new Date("2021-07-04T07:00:00.000Z").getTime())

    这是另一个 tool 来计算这些值。

    通过使用1625382000000,我们将测试模式延长了一个月,每个人都可以读取/写入整个数据库,直到 2021 年 7 月 4 日。


    如何更好地保护数据?

    在某些时候,您应该想出一种更好的方法来保护您(用户的)数据,而不仅仅是在特定日期之前打开它。当我开始一个项目时,我通常会这样做,但如果你晚一点开始它也可以。

    重要的是您应该将服务器端安全规则与应用程序的客户端源代码一样对待

    我同时开发我的代码和规则。所以:

    1. 我从一个完全封闭的数据库开始,因为还没有代码需要访问任何数据。

    2. 我手动将一些数据添加到数据库中,并编写代码来读取它。此时,我编写了只允许读取特定数据的安全规则。所以它可能是".read": true,但它在我的 JSON 结构中会更深。即使是这样简单的规则,也已经阻止了许多不良行为者。

    3. 我第一次希望应用程序写入到数据库也是在我添加身份验证时。通常我从匿名身份验证开始,因为它不需要我输入任何凭据。

      然后我将硬编码的 UID 包含在我的安全规则中,以确保只有我可以写入数据。在我添加了适当的数据所有权之后,您经常会在我的规则中找到这个顶级 ".write": "auth.uid === 'hardcodedUidOfPufsAnonymousUser'"

      使用 Firestore 时,我有时会按照此处的说明进行改进:User conflict when using same Auth method for Admin and Normal users | Firebase Auth

    4. 在我添加(通常是列表)数据的任何时候,我都会考虑谁“拥有”这些数据,以及谁可以读取它。然后我扩展我的规则以允许该访问,仅此而已。

    这需要在我编写代码时更新我的​​安全规则,这会减慢我编写代码的速度,但我还是很乐意这样做。在每一步都确保数据库中的数据安全,让我可以让人们充满信心地访问应用程序/数据库。我建议你也这样做。

    更多信息,我推荐阅读:

    【讨论】:

    • 是的,谢谢,这是对这些规则和时间戳的详细解释非常有用。我想我发现,当您设置 Firebase 实时数据库时,无法通过更改时间戳来更改自动生成的规则。我做了开放的 .read 和 .write 规则,但我不确定在开发状态下学习时是否需要它们。在项目设置身份验证之前,我会密切关注它。你的帮助很棒!
    • 在创建数据库的过程中无法更改默认规则,但之后可以在 Firebase 控制台中编辑这些规则。
    猜你喜欢
    • 2019-01-14
    • 2011-10-22
    • 2020-08-08
    • 2020-12-28
    • 2021-10-26
    • 2021-12-05
    • 2017-05-09
    • 2021-02-13
    相关资源
    最近更新 更多