【问题标题】:javascript transaction log for server side validation用于服务器端验证的 JavaScript 事务日志
【发布时间】:2019-01-20 17:32:58
【问题描述】:

在由客户端 (js) 编写但包含多人游戏元素(例如排行榜)的游戏中。将用户操作记录到带有时间戳的事务日志以验证提交数据的完整性以及如何验证此日志中的操作的最佳方式是什么?

是否有必要这样做,或者编写一个向服务器提交分数并混淆代码的哈希函数就足以防止这种作弊?

编辑 - 游戏描述:

在这个游戏中,你在一张 50 格长的地图上行走。在每个图块上,您都会遇到敌人/城镇/事件(寻找硬币等)每次到达地图的尽头时,都会加载一个难度稍高的新地图。这个难度与玩家和他从城镇购买的物品一起被保存(在 MYSQL 数据库上使用 PHP)。物品的力量值取决于它们的统计数据(伤害/生命值/防御等)。物品的力量被求和并被保存。

实力、阶段(难度)和用户名是排名前 10 名玩家的显示内容,按最高实力排序。

【问题讨论】:

  • 您能否提供更多上下文,也许是您想要实现的代码 sn-p,因为这有点模糊......您要验证哪些操作?运动,得分,你的比赛有什么意义?

标签: javascript php html anti-cheat


【解决方案1】:

一般来说,没有有效的方法来防止客户端作弊。
就排行榜和发布分数的用户而言,防止作弊的唯一方法是在后端处理数据,或者至少尝试在那里验证数据。

在发送到服务器之前对数据进行散列不会有帮助,因为有人可以在散列之前轻松修改数据。

事务日志无济于事,因为有人可以在将数据提交到事务日志之前轻松修改数据,甚至禁用日志记录。

混淆基本上是security through obscurity,这会使你的代码更难被破解,但绝对不会让它作弊安全。

同样,您永远不能信任来自客户端的任何数据,因此您需要一个后端来控制整个游戏过程或验证数据。

【讨论】:

  • 此答案适用于任何类型的多人游戏,但有关您的游戏的一些细节可能有助于改进此答案。
  • 我将编辑带有游戏描述的原始问题。
  • @Levi 根据您的更新,似乎您几乎在后端完成所有操作。为什么不在后端也实施记分牌?您的数据库中有所有必要的数据。
  • 所有业务逻辑都发生在客户端,我在编辑中所说的功能基本上只是将播放器对象作为 json.stringified 发送到数据库,其中包含排行榜分数所需的所有内容,也许我是对此还不够清楚。它绝对不是后端,字符串被发送回客户端。然后,客户端将字符串化对象转换为具有这些值的新玩家对象,作为加载角色的一种方式。
猜你喜欢
  • 1970-01-01
  • 2014-09-29
  • 2020-09-08
  • 1970-01-01
  • 2012-01-06
  • 2010-09-14
  • 1970-01-01
相关资源
最近更新 更多