javascript - 如何防止 Firebase 请求伪造?

标签 javascript firebase checksum

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

ASCII Tetris Game

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

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

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

最佳答案

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

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

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

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

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

所以我的典型步骤是:

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

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

关于javascript - 如何防止 Firebase 请求伪造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66896313/

相关文章:

Firebase 托管不更新连接的域

c++ - 了解 TCP 校验和功能

javascript - 如何在 Blogger 中添加 JavaScript?

xcode - 没有这样的模块 'Firebase'?

javascript - HTML 和 JSP - 如何在表单上启动操作而不移动到另一个页面

android - Kotlin 图像压缩实现

time - Rsync 校验和仅适用于相同大小的文件

git - Git 如何计算文件哈希值?

javascript - Google-Chart-angularjs 是否支持 "date"类型?

javascript - 根据屏幕/窗口/设备大小制作网页拉伸(stretch)(或缩小)