Firebase RTDB规则阻止“设置”,但仍允许“更新”

时间:2019-06-18 05:47:12

标签: firebase rules firebase-security-rules

我试图仅允许其子级为“ A_Key”的Firebase表写入/更新。我设法在Firebase规则模拟器中阻止了“设置”,但无法阻止“更新”。 “更新”模拟总是成功的。

我尝试将其写到表中。

PYTHONIOENCODING=UTF-8 python3 -c 'print(b"\xf2a27".decode("latin1"), end="")' | wc -c
# will output 5

PYTHONIOENCODING=latin1 python3 -c 'print(b"\xf2a27".decode("latin1"), end="")' | wc -c
# will output 4

这是我的规则

{
    "objectId" : "XXaabb",
    "value" : 135
}

模拟集被拒绝。这就是我想要的。 然而 允许模拟更新。这不是我想要的。

我想要的结果是两个都应该被拒绝。

2 个答案:

答案 0 :(得分:0)

如果您希望在设置时在数据中包含A_key,并且在更新此数据时应再次具有A_key的值,然后使用以下规则:

"myTable": {
  "$uid": {
    ".write": "(((data.val() == null && (auth.uid == $uid)) && newData.child('A_key').val() != null) || (((data.val() != null && newData.val() != null) && (auth.uid == $uid)) && data.child('A_key').val() != null))",
    ".read": "(auth.uid == $uid)"
  }
}

等效螺栓:

path /myTable/{uid} {
    read() {isCurrentUser(uid)}
    create() {isCurrentUser(uid) && this.A_key != null}
    update() {isCurrentUser(uid) && prior(this.A_key) != null}
}

isCurrentUser(id) {
  auth.uid == id
}

如果您希望在更新时不更改A_key的值,请使用以下方法:

"myTable": {
      "$uid": {
        ".write": "(((data.val() == null && (auth.uid == $uid)) && newData.child('A_key').val() != null) || (((data.val() != null && newData.val() != null) && (auth.uid == $uid)) && data.child('A_key').val() == newData.child('A_key').val()))",
        ".read": "(auth.uid == $uid)"
      }
    }

等效螺栓:

path /myTable/{uid} {
    read() {isCurrentUser(uid)}
    create() {isCurrentUser(uid) && this.A_key != null}
    update() {isCurrentUser(uid) && prior(this.A_key) == this.A_key}
}

isCurrentUser(id) {
  auth.uid == id
}

https://github.com/FirebaseExtended/bolt/blob/master/docs/guide.md

答案 1 :(得分:0)

我做了一个小小的改动,现在可以了

newData.hasChild('A_Key')

应该是

newData.child('A_Key').exists()