【问题标题】:How to set security rules to prevent delete data in firebase?如何设置安全规则以防止删除 Firebase 中的数据?
【发布时间】:2016-02-25 16:36:27
【问题描述】:

我的 firebase 结构喜欢:

"ROOT": {
  "Group": {
    "User": {
      "Name": "",
      "Email": "",
      "Gender": "",
      "Mobile": "",
      "Time": ""
    }
  }
}

我的问题是,如何防止用户直接从客户端浏览器检查器运行 ref.remove(),这将在没有任何提示的情况下删除所有数据?

我想允许客户端脚本运行像

这样的 firebase 操作
  1. 向/ROOT/添加/更新数据,我的意思是,添加更多“组”子节点, 像 Group2, Group3...,但不能删除这个节点。
  2. 并在/ROOT/Group/下添加数据,以及更新和删除

如何设置安全规则?谢谢。

【问题讨论】:

  • @Shilly,如果 ref 在浏览器范围内,我没关系。任何人都可以创建 Firebase ref 并调用 remove。您也可以只向 root 发送一个 HTTP 删除请求。你需要有服务器端的安全性。
  • 好的,谢谢您的解释。 (删除后:))

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


【解决方案1】:

您可以使用的其他一些有用的 Bolt 功能:

path /create { write() { create(this) } }                                                                                                                                         
path /update { write() { update(this) } }                                                                                                                                         
path /delete { write() { delete(this) } }                                                                                                                                         
path /create-or-update { write() { create(this) || update(this) }}                                                                                                                

create(ref) { prior(ref) == null }                                                                                                                                                
update(ref) { prior(ref) != null && ref != null }                                                                                                                                 
delete(ref) { prior(ref) != null && ref == null }  

查看this sample file,它是tests

【讨论】:

    【解决方案2】:

    查看Bolt

    Bolt 是 Firebase 的架构验证工具。

    因此,您可以定义 GroupUser 架构,然后编写规则以确保未经授权的任何人都无法删除它。

    type User {
     Name: String;
     Email: String;
     Gender: String;
     Mobile: String;
     Time: Number;
    }
    
    path /group/$groupid {
      read() = true;
      write() = this != null; // don't delete existing data
    }
    
    path /group/$groupid/user/$uid is User {
      read() = true;
      write() = this != null; // don't delete existing data
    }
    

    现在您只需从命令行生成安全规则,或使用 Firebase CLI 上传它们。 Bolt 尚不支持仪表板。如果需要,您还可以将生成的规则复制并粘贴到仪表板中。

    【讨论】:

    • 哇,非常感谢,大卫,我会调查的。
    • 如果对您有用,请将答案标记为正确。如果不让我知道出了什么问题。保持未回答的队列清晰是件好事。
    • Firebase 3 似乎不支持 Bolt
    • @ZuzEL 是什么让你这么认为?从我通过搜索可以找到的内容来看,它在最新版本中仍然可以使用。 (毕竟它只是规则文件的编译器;所以即使输出有问题,您也可以手动修复这些问题然后上传)