【问题标题】:Writing game logic in Firebase在 Firebase 中编写游戏逻辑
【发布时间】:2020-02-03 11:47:12
【问题描述】:

我正在开发一个乘数棋盘游戏(非常类似于国际象棋)。我使用 Firestore 作为后端。我知道为了防止游戏作弊,我需要将游戏逻辑(验证合法移动、更改回合、倒计时)放在服务器端而不是客户端。现在,据我了解,在 Firebase 中配置服务器端行为主要有两个地方:云函数和安全规则。我考虑过使用安全规则来验证移动和云功能来翻转转弯和倒计时。我对安全规则没有太多经验,但我认为编写规则来验证移动会太复杂。或者,我考虑阻止客户端对 Firestore 的所有写访问,并编写 HTTPS 云函数供客户端调用。例如,我将有一个移动功能。客户端将调用此函数,而不是直接写入 Firestore。我不知道该怎么做。你怎么看?

【问题讨论】:

  • 这个说法不准确为了防止游戏作弊,我需要把游戏逻辑放在服务器端,不知道这些信息是从哪里来的。如果这是真的,那么任何数据都可能受到损害。规则控制对存储在 Firebase 中的应用数据的读/写访问 - 它们可能不是验证移动的正确位置,因为(通常)会涉及到应用处理的逻辑。例如防止主教在棋盘上垂直移动;您可能可以在规则中实现这一点,但最好通过代码级计算来处理
  • 任何有足够经验的人都可以模仿你的客户。这不是 Firebase 的问题。这是软件的本质。任何可访问的软件都可以通过足够的时间和精力进行逆向工程。
  • 你可能会发现这个答案很有帮助stackoverflow.com/a/40564807/4330274
  • 是的 - 完美的答案并直接与我所说的内容对话仅访问他们获得授权的数据。。很好的答案,可以非常准确地解决您的问题。查看后续问题和答案How do I prevent un-authorized access to my Firebase Database?
  • 好的,你同意我们必须把游戏逻辑放在服务器端而不是客户端吗?

标签: firebase google-cloud-firestore google-cloud-functions firebase-security


【解决方案1】:

正如您所说,有两种广泛的选择:

  1. 验证安全规则中的移动。
  2. 在 Cloud Functions 中验证移动。

由于安全规则接近图灵完备,您几乎可以在其中表达任何要求。但是随着你的游戏规则变得越来越复杂,你会看到在那里实现你的游戏逻辑的收益递减。对于我们大多数人来说,安全规则的声明性质很难做到正确。

因此,对于更复杂的游戏规则,我通常会选择让代码以 Cloud Functions 的形式强制执行它们。所以在那种情况下:

  1. 客户端将“游戏回合”写入数据库。
  2. 此游戏回合的结构已通过安全规则验证。
  3. 写入操作触发云函数。
  4. 此 Cloud Function 解释游戏回合,并更新游戏状态。
  5. 然后所有客户端都会看到新的游戏状态。

Firebase 的 Doug Stevenson 在 2017 年 Google I/O 上展示了这种方法的精彩演讲:Architecting for Data Contention in a Realtime World with Firebase。虽然他在那里使用 Firebase 实时数据库(因为 Firestore 尚未发布),但同样的方法适用于 Cloud Firestore。

【讨论】:

  • 我想在这个出色的答案中添加一个注释,如果首先设置了适当的规则,就永远不需要广泛的选项 1. 和 2.。换句话说,如果规则不允许从应用程序外部访问数据,那么某人将无法从应用程序外部随机更改它。例如有人不能只是“登录”并移动棋子 - 规则会阻止访问该数据。
  • 另外请注意,如果 Firebase 数据可以从应用程序外部随机更改(即“作弊”),那么它对于应用程序来说就不是一个非常安全的数据库,对吧?规则旨在允许/阻止读/写访问并验证数据是否符合预期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
相关资源
最近更新 更多