我有一款具有全球高分功能的游戏。它使用firebase数据库,如果是高分,则写入用户的分数。规则规定任何人都可以阅读或写作,以便其他人可以查看高分。
我的问题是,在没有真正获得分数的情况下操纵高分很容易。当你获得一个新的高分时,如何将它写入数据库,但如果你进入控制台并更改数据,它将不允许你改变它?
if (score > worldScore) {
database.ref().update({highscore: score});
}
您可以看到更改数据非常容易。
答案 0 :(得分:1)
在Firebase控制台中,您可以在数据库中读取或写入的内容从不受任何限制。安全规则永远不适用于那里。
答案 1 :(得分:1)
严格来说,除非您涉及某些服务器组件,可以通过某种方式确认合理地获得分数,否则这是不可能的。客户端数据始终受用户操纵;您在客户端上执行的对该数据的任何确认检查也将受到用户操纵。
(至于如何实际执行服务器端确认:它将取决于游戏的细节,但一种方法可能是让客户定期向服务器发送重要的游戏数据;如果服务器可以确定任何数据的变化是根据游戏规则不可能实现的 - 比如分数在一段时间内跳得太远 - 然后忽略该用户未来提交的任何分数。即使这并不完美:用户仍然可以通过操纵在该定期轮询中发送的数据来作弊,但他们必须至少在合理范围内保持他们的更改。)
答案 2 :(得分:0)
通常,您不仅要存储分数,还要存储玩家获得该分数的方式。例如:如果是棋盘游戏,请在结果中写下他们的动作。如果你有两个,你可以:
这两个过程都是“可信代码”的情况,即应该在受信任环境中运行的代码。为此,您可以使用您控制的环境(私人服务器,笔记本电脑等),Firebase for Firebase,或者(在某些情况下)Firebase的服务器端安全规则。哪些是可行的取决于您的确切用例和可用时间。