【问题标题】:Firebase Database - Write data from program only, not personFirebase 数据库 - 仅从程序写入数据,而不是人
【发布时间】:2018-04-04 08:36:04
【问题描述】:

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

我的问题是很容易在没有实际得分的情况下操纵高分。我怎样才能做到,当你获得一个新的高分时,它被写入数据库,但是如果你进入控制台并更改数据,它不允许你更改它?

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

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

【问题讨论】:

  • 请出示一些代码。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

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

【讨论】:

  • 我很确定他们指的是浏览器控制台,而不是 firebase 控制台。
  • @DanielBeck 是的,我的意思是有人可以进入 JavaScript 控制台并更改数据库中的数据。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    1. 验证他们写的分数确实是应用移动得到的分数。
    2. 执行一些分析以检测这些动作是否可能是计算机生成的。

    这两个过程都是“可信代码”的情况,即应该在可信环境中运行的代码。为此,您可以使用您控制的环境(私人服务器、笔记本电脑等)、Firebase 的 Cloud Functions 或(在某些情况下)Firebase 的服务器端安全规则。哪些可行取决于您的确切用例和可用时间。

    【讨论】:

      猜你喜欢
      • 2017-10-28
      • 2018-01-12
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2017-07-16
      • 2017-05-07
      相关资源
      最近更新 更多