如果您在浏览器中使用 Firebase 实时数据库,则需要共享 API key ,因此无法保护数据库。我有一个简单的游戏(ASCII Tetris),可以保存游戏的最高分,问题是任何人都可以欺骗请求并发送自己的分数。 (这里是一个人所做的截图):
有什么解决方案可以防止这种情况发生?我正在考虑做与防止 CSRF 相同的事情,你创建一个 token 并验证它是否有效,这样只有我的代码才会有适当的 CSRF 之类的 token 。攻击者仍然可以在调试器中暂停应用程序并检查 token 并发送他自己的 token ,但这需要他知道如何使用调试器,因此破解起来会稍微困难一些。
firebase 实时数据库有 ".validate"
规则,您可以在其中验证 token 是否有效 (https://firebase.google.com/docs/database/security)。我也在考虑创建类似校验和链的东西(比如在 git 或区 block 链中)。
你认为这样的东西有可能创造出来吗?您知道对于我保存分数的情况是否有更好的方法来保护 firebase 实时数据库?对于这个简单的游戏,答案可能对其他情况有用,而不是像我这样的简单情况。
最佳答案
您可以在 Firebase 的安全规则中实现惊人的复杂性。例如,我曾经看到验证国际象棋走法的规则 - 非常令人印象深刻。
大多数情况下,我建议存储足够的信息以重播发生的事情,以便您可以检查结果是否有效。我的第一个 Firebase 游戏是一个文字输入游戏,所以我会存储:
这让我可以重玩游戏以检查我是否得到了相同的结果。但它也允许我(在未来)编写代码来检查按键中的不规则模式。例如,我的机器人过去常常以非常特定的时间间隔按下一个键。当然,恶意用户可以轻松地使其变得更加智能,但您也可以改进您的作弊检测代码。
这样的作弊检测代码当然不应该出现在客户端中,因为这会给恶意用户提供您不希望他们拥有的信息。因此,您将在受信任的环境中运行此代码,例如您的开发机器、您控制的服务器或 Cloud Functions。
所以我的典型步骤是:
欢迎来到游戏开发者与恶意玩家的军备竞赛。 :)
https://stackoverflow.com/questions/66896313/
相关文章:
firebase - 参数类型 'Object?' 无法分配给参数类型 'Map
azure-devops - Azure DevOps Pipeline 永远停留在 Pending
r - purrr::pluck - 如何获取列表的最后一个元素
javascript - 如何在 VueJS 中处理插槽的 onClick 事件
python - 你将如何在 python 中打印数字 1、2、3、4、5、6、7、8、18、19、
reactjs - 错误 : Final loader (./node_modules/awesom