Я разрабатываю многопользовательскую игру с Firebase. Очки игрока записываются в базе данных после каждой игры, а также поле playerTotalScore обновляется с учетом нового итога. Мой вопрос: возможно ли защитить поле playerTotalScore от произвольных манипуляций со стороны пользователя, используя только правила безопасности на основе firebase? Если да, то как?
Я долго просматривал информацию о безопасности на базе Firebase. Хотя я понимаю, что в правилах безопасности можно реализовать некоторую сложную логику (".write": "!data.exists()"
число на определенную величину, например, эту суть, или сделать поле ".write": "!data.exists()"
только для вставки (".write": "!data.exists()"
) в этом случае никакая информация, похоже, не поможет. Правил только приращения будет недостаточно, поскольку счет можно манипулировать, увеличивая его несколько раз. Только вставка, по-видимому, является опцией для totalScore, поскольку она обновляется после каждого игра.
Обновить
По просьбе Като, здесь приведен конкретный вариант использования.
Игра, которую я разрабатываю, - это игра-опрос, в которой игроки отвечают на вопросы, и результаты игроков отображаются в режиме реального времени.
В течение игры счет для этой конкретной игры обновляется после каждого вопроса следующим утверждением:
gameRef.child('players').child(UserId).child('score').set(gameScore)
После окончания игры totalScore (все сыгранные игры) для игрока рассчитывается как totalScore=totalScore+gameScore
а затем общая оценка игроков обновляется в Firebase с использованием следующего утверждения:
leaderboardRef.child(userId).setWithPriority({userName:userName, totalScore:totalScore}, totalScore)
Обновление 2: структура данных в соответствии с просьбой Като
Вот конкретная структура, которая у меня сейчас есть. Это далеко не все, поэтому я готов изменить его так, как это необходимо, в соответствии с рекомендуемым подходом для защиты данных.
Счет за каждую игру, сыгранную пользователем (игроком), сохраняется в следующей структуре
<firebase_root>/app/games/<gameId>/players/<userId>/score/
<gameId>
- это ключ, сгенерированный <gameId>
в результате вызова метода push() firebase. <UserId>
- это простой логин пользователя firebase.
TotalScore (сумма всех очков за все сыгранные игры) для каждого пользователя (игрока) хранится в следующей структуре данных
<firebase_root>/app/leaderboard/<userId>/totalScore/
данные списка лидеров для totalScore устанавливаются с использованием totalScore в качестве приоритета для запросов
leaderboardRef.child(userId).setWithPriority({userName:userName, totalScore:totalScore}, totalScore)
Score и totalScore являются числовыми целочисленными значениями. Это все детали текущей структуры данных, о которых я могу думать.