如何指定已知路径的读取访问权限但禁用 Firebase 数据库中的枚举?

Sco*_*zie 4 firebase firebase-security firebase-realtime-database

我想在 Firebase 中指定规则,以便只有已知的路径才能访问。

/root
  /messages
    /message1
    /message2
    /message3
Run Code Online (Sandbox Code Playgroud)

如果您访问 /messages,您可能会收到权限被拒绝的消息(或什么也没有)。

如果您显式访问 /messages/message2,您将获得内容。

更新 1:预期行为 (iOS)

FIRDatabase .database() .reference() .child("邀请") .observeEventType(.Value, withBlock: { 快照中

// 快照不返回任何内容或权限被拒绝。})

FIRDatabase
  .database()
  .reference()
  .child("invitations/message1")
  .observeEventType(.Value, withBlock: { snapshot in

  // snapshot returns message1
})
Run Code Online (Sandbox Code Playgroud)

ara*_*b31 6

这不是答案,但我相信OP正在询问如何防止枚举给定节点下的节点,同时如果用户知道给定节点的直接路径,则允许匿名访问。

我也一直在试图弄清楚如何做到这一点。基本上,我试图在给定节点下发布半敏感数据,同时通过不同的方式安全地提供节点的名称。但是,我不想在 Firebase 中实现“安全/用户”模型。我只是想使用类似于 Amazon S3 存储桶的 Firebase,如果您知道密钥的位置,则可以下载存储在该位置的文件/数据,同时仍然防止枚举/列出数据库中的节点。

此类用法的一个示例是,如果您使用 SHA2 等加密摘要生成密钥名。密钥不容易生成,但如果知道密钥,就可以直接访问该节点。有谁知道如何做到这一点?

编辑:我想出了如何在 Firebase 中执行此操作。解决方案相当简单。以下是 Firebase 中 JSON 安全规则的示例:

{
    "rules": {
        "users" : {
          ".read": false,
          ".write": false,
          "$child" : {
            ".read" : true,
            ".write" : true
          }
        },
        "chats" : {
          ".read" : false,
          ".write" : false,
          "$child" : {
            ".read" : true,
            ".write" : true,
          },
        },
        "comments" : {
          ".read" : false,
          ".write" : false,
          "$child" : {
            ".read" : true,
            ".write" : true
          },
        },
        ".read": false,
        ".write": false
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,“用户”、“聊天”和“评论”下的任何节点都可以直接访问,但不再可能进行枚举。