Firebase实时数据库规则-安全功能

时间:2020-03-30 15:28:24

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

在我的数据库中,我具有以下结构。

/ Players / UID {1,2,3,... n} /每个UID ==> {Child1,Child2,... Childn}

在规则中,为了保护数据,我在子级之间创建了一个类似于以下内容的函数,但是,写操作任务出错,我不知道原因。另外,您可以提出一些更安全,更实用的实施方案吗?

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null && newData.child('Child1').val() * newData.child('Child1').val() * 1000000 + 1000 * newData.child('Child1').val() - 1000 === newData.child('Child2').val()"
  }
}

我的简化写函数如下所示,其中Child2是Child1的函数;

public void WriteDatabase(float child1, int child2)
    {
        if (AuthController.Instance != null && AuthController.Instance.user != null)
        {
            uid = AuthController.Instance.user.UserId;
        }
        else
        {
            return;
        }
        LeaderBoardEntry entry = new LeaderBoardEntry(child1, child2);

        Dictionary<string, System.Object> entryValues = entry.ToDictionary();
        Dictionary<string, System.Object> childUpdates = new Dictionary<string, System.Object>();
        childUpdates["/Players/" + uid + "/"] = entryValues;
        reference.UpdateChildrenAsync(childUpdates).ContinueWith(task =>
        {
            if (task.IsCanceled)
            {
                UnityEngine.Debug.Log("Write database cancelled");
                return;
            }

            if (task.IsFaulted)
            {
                UnityEngine.Debug.Log("Write database faulted");
                return;
            }

            if (task.IsCompleted)
            {
                UnityEngine.Debug.Log("Write database completed");
            }
        });
    }

注意:写入功能符合以下规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

1 个答案:

答案 0 :(得分:1)

设置您的规则以验证写入根的数据:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null && 
       newData.child('Child1').val() * newData.child('Child1').val() * 1000000 + 1000 * newData.child('Child1').val() - 1000
        === newData.child('Child2').val()"
  }
}

因此,这允许任何经过身份验证的用户将与特定公式匹配的值写入数据库的根。

但是您的代码正在将相同的结构写入/Players/$uid,它在数据库中的不同位置。

您需要确保在数据库的正确位置定义以下验证规则:

{
  "rules": {
    ".read": "auth != null",
    "Players": {
      "$uid": {
        ".write": "auth != null && 
           newData.child('Child1').val() * newData.child('Child1').val() * 1000000 + 1000 * newData.child('Child1').val() - 1000
            === newData.child('Child2').val()"
      }
    }
  }
}