如何防止 Firebase 请求伪造?

jcu*_*bic 2 javascript checksum firebase

如果您在浏览器中使用 Firebase 实时数据库,则需要共享 API 密钥,因此无法保护数据库。我有一个简单的游戏(ASCII Tetris)可以保存游戏的高分,问题是任何人都可以欺骗请求并发送自己的分数。(这是一个人所做的截图):

ASCII 俄罗斯方块游戏

有什么解决方案可以防止这种情况?我正在考虑对 CSRF 的保护做同样的事情,在那里你创建一个令牌并验证它是否有效,这样只有我的代码才会有适当的 CSRF 像令牌。攻击者仍然可以在调试器中暂停应用程序并检查令牌并发送他自己的令牌,但这需要他知道如何使用调试器,因此破解会有点困难。

firebase 实时数据库有".validate"规则,您可以验证令牌是否有效(https://firebase.google.com/docs/database/security)。我也在考虑创建类似校验和链的东西(比如在 git 或区块链中)。

你认为有可能创造出这样的东西吗?您知道对于我保存分数的情况,是否有更好的方法来保护 firebase 实时数据库?对于这个简单的游戏,除了像我这样的简单案例之外,答案可能对其他案例有用。

Fra*_*len 14

您可以在 Firebase 的安全规则中实施惊人的复杂性。例如,我曾经看到验证国际象棋移动的规则 - 非常令人印象深刻。

大多数情况下,我建议存储足够的信息来重播发生的事情,以便您可以检查结果是否有效。我的第一个 Firebase 游戏是打字游戏,所以我会存储:

  • 游戏的种子
  • 每个按键及其时间戳
  • 总分

这使我可以重玩游戏以检查是否得到相同的结果。但它也允许我(将来)编写代码来检查按键中的不规则模式。例如,我的机器人过去常常以非常特定的时间间隔按下一个键。当然,恶意用户可以轻松地使其更加智能,但您可以改进作弊检测代码。

此类作弊检测代码当然不应出现在客户端中,因为这会给恶意用户提供您不希望他们拥有的信息。因此,您可以在受信任的环境中运行此代码,例如您的开发机器、您控制的服务器或 Cloud Functions。

所以我的典型步骤:

  1. 存储用户的确切动作,以及您的 PRNG 的种子,以便您可以重现准确的游戏。
  2. 使用安全规则尽可能拒绝无效动作。
  3. 使用安全规则来拒绝极不可能的结果,例如高于特定数量的分数(尤其是当您可以将其与游戏花费的时间联系起来时)。
  4. 使用服务器端代码检查玩家所做的动作是否会导致他们得到的结果。
  5. 考虑隔离异常高的分数,以便您可以在将它们发布到记分板之前通过重播来验证它们。这将是客户端代码和服务器端安全规则的组合。
  6. 如果您怀疑滥用,请检查动作列表。如果这种情况经常发生,请开始自动化。

欢迎来到游戏开发者与恶意玩家的军备竞赛。:)