【问题标题】:Securing firebase table that multiple users need to write to保护多个用户需要写入的 firebase 表
【发布时间】:2020-02-25 00:00:30
【问题描述】:

我有一个具有以下结构的 firebase 实时数据库:

users:
  user_id:
    name: str
    friend_ids: [str]
records:
  record_id:
    text: str

我现在正在尝试保护该数据库,以尽量减少恶意用户删除或覆盖数据库中有价值信息的可能性。如果每个用户只能写入用户表中的记录,我相信我可以使用 Firebase 规则来保护数据,例如:

"users": {
  "$uid": {
    ".write": "$uid === auth.uid"
  }
}

但是,每个用户还需要能够写入其他用户的记录,例如用户 A 可以和用户 B 成为朋友,并且可以原子地更新用户 A 和 B 的friend_ids 属性。

我的问题是:我应该如何使用这种设置来保护数据库?每个用户都需要能够写入任何 user_id 和任何 record_id。其他人可以就这个问题提供的任何建议都会非常有帮助!

【问题讨论】:

  • “每个用户都需要能够写入任何 user_id” - 这与您在上一段中关于朋友的内容直接冲突。假设您不是要准确地说出这个,那么您要做的就是使用数据库中表达用户之间关系的内容,并在规则中对其进行查询以确保满足所需的条件给定写操作。见:firebase.google.com/docs/database/security/…
  • 似乎所需的方法是将属性存储在用户表的注册用户记录中,然后使用一些基于属性的安全规则:firebase.google.com/docs/rules/…
  • @DougStevenson(很高兴认识另一个 Doug!)感谢您的来信。是的,我想我需要类似 firebase 文档中基于属性的身份验证:firebase.google.com/docs/rules/…

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


【解决方案1】:

如果我对您的理解正确,您希望任何用户都能够在其他人的朋友列表中写入自己的 UID,只要他们同时在自己的朋友列表中写入其他人的 UID。

如果是这样的话,那就是:

"friends": {
  "$uid1": {
    "$uid2": {
      ".write": "$uid1 === auth.uid && 
        newData.parent().parent().child($uid2).child(auth.uid).exists"
    }
  }
}

为简单起见,我编写了检查,好像friends 节点位于此处的顶层。我实际上还是建议这样做,因为最好在 Firebase 中使用 model flat lists,而不是嵌套实体类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2021-09-10
    • 2018-07-17
    • 1970-01-01
    相关资源
    最近更新 更多