Правило базы данных Firebase в реальном времени - функция безопасности - PullRequest
0 голосов
/ 30 марта 2020

В моей базе данных у меня есть следующая структура.

/ Игроки / 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 Ответ

1 голос
/ 31 марта 2020

Ваши правила настроены для проверки данных, которые записываются в root:

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

Таким образом, это позволяет любому аутентифицированному пользователю записать значение, соответствующее указанной формуле c, в root базы данных.

Но ваш код записывает ту же структуру в /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()"
      }
    }
  }
}
...