【问题标题】:Firebase Realtime Database Rule - Security FunctionFirebase 实时数据库规则 - 安全功能
【发布时间】:2020-07-11 00:32:58
【问题描述】:

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

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

在规则中,为了保证数据的安全,我在childs之间创建了一个类似下面的函数,但是写操作任务出错了,我不知道原因。此外,您能否提出一些更安全、更实用的实施方案?

{
  "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");
            }
        });
    }

注意:write 函数适用于以下规则:

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

【问题讨论】:

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


【解决方案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()"
      }
    }
  }
}

【讨论】:

  • 首先感谢弗兰克的帮助,更好地表示我的数据库结构。经过大量试验,我意识到,错误是 Permission Denied 由于浮动变量不被识别为数字并且计算不起作用的原因......我创建了另一个整数变量来检查它,它的工作原理就像魅力:)
  • 如果需要,如何在规则中获取“1.002”的值作为数字进行计算? .val() 我猜它是字符串。
  • .val() 获取节点的值,无论它存储在什么位置。如果您存储了一个数字,它就会得到一个数字。我隐约记得一些关于浮点数的事情,但无法立即找到有关它的内容。如果您可以重现该问题,我建议您使用minimal, complete/standalone reproduction 提出问题。请确保以文本形式包含最少的代码、JSON 和规则,以使他人更容易从您共享的内容中复制。
猜你喜欢
  • 2020-08-08
  • 2020-12-28
  • 2021-10-26
  • 2021-02-13
  • 2018-08-27
  • 2021-02-11
  • 2021-12-05
  • 2022-11-11
相关资源
最近更新 更多