Firebase数据库 - 仅从程序中写入数据,而不是人

时间:2018-04-03 23:53:24

标签: javascript firebase firebase-realtime-database

我有一款具有全球高分功能的游戏。它使用firebase数据库,如果是高分,则写入用户的分数。规则规定任何人都可以阅读或写作,以便其他人可以查看高分。

我的问题是,在没有真正获得分数的情况下操纵高分很容易。当你获得一个新的高分时,如何将它写入数据库,但如果你进入控制台并更改数据,它将不允许你改变它?

if (score > worldScore) { database.ref().update({highscore: score}); }

您可以看到更改数据非常容易。

3 个答案:

答案 0 :(得分:1)

在Firebase控制台中,您可以在数据库中读取或写入的内容从不受任何限制。安全规则永远不适用于那里。

答案 1 :(得分:1)

严格来说,除非您涉及某些服务器组件,可以通过某种方式确认合理地获得分数,否则这是不可能的。客户端数据始终受用户操纵;您在客户端上执行的对该数据的任何确认检查将受到用户操纵。

(至于如何实际执行服务器端确认:它将取决于游戏的细节,但一种方法可能是让客户定期向服务器发送重要的游戏数据;如果服务器可以确定任何数据的变化是根据游戏规则不可能实现的 - 比如分数在一段时间内跳得太远 - 然后忽略该用户未来提交的任何分数。即使这并不完美:用户仍然可以通过操纵在该定期轮询中发送的数据来作弊,但他们必须至少在合理范围内保持他们的更改。)

答案 2 :(得分:0)

通常,您不仅要存储分数,还要存储玩家获得该分数的方式。例如:如果是棋盘游戏,请在结果中写下他们的动作。如果你有两个,你可以:

  1. 确认他们所写的分数确实是通过应用这些动作获得的分数。
  2. 执行一些分析以检测移动是否可能是计算机生成的。
  3. 这两个过程都是“可信代码”的情况,即应该在受信任环境中运行的代码。为此,您可以使用您控制的环境(私人服务器,笔记本电脑等),Firebase for Firebase,或者(在某些情况下)Firebase的服务器端安全规则。哪些是可行的取决于您的确切用例和可用时间。