游戏的分数基于客户端倒计时。如何防弹呢?

2022-08-30 23:09:41

我正在开发一款基于JavaScript倒计时的游戏:在倒计时达到零之前,你完成关卡的速度越快,你的分数就越大。

当我最终从服务器端的客户端接收它时,如何确保它不会以某种方式被更改?

我最初的想法是制作两个检查点:一个在关卡的开头,另一个在关卡的末尾。检查点基本上是通过AJAX发送到服务器端PHP脚本的会话,然后带有时间戳。因此,在客户端完成游戏后,将使用服务器端的分数进行验证。这种保护有什么好处吗?

提前感谢您!

编辑:我也对实现所需功能的任何其他方法持开放态度。


答案 1

只需将值存储在数据库的日期时间字段中。然后,你用这个值来播种你的javascript。因此,客户端上的任何更改都不会对存储时间产生影响。

但是,如果您依赖客户端来获取值,则无法执行任何操作来确保其正确。用户仍然可以欺骗ajax请求,而不会出现真正的问题。这让它有点困难,但肯定是可行的。

一旦您的倒计时以某种方式与客户端相关,就无法逃脱:)


答案 2

正如其他人所指出的那样,您无法确定时代没有被篡改,但是有一些方法可以减轻后果:

如果您的(服务器端)系统怀疑分数已被篡改,则可以将该 IP 地址或 Cookie 列入黑名单,并且不向其他用户显示这些分数。不过,向黑客显示分数。这有几个影响:首先,如果他们认为他们已经击败了你,他们可能会继续前进,让你的代码独自一人。其次,如果你的作弊检测错误地认为忍者玩家在黑客攻击,玩家仍然会在表格中看到他们的分数正常(即使其他玩家没有)。因此,误报并不重要,你可以使用更模糊的算法,例如,这个玩家的改进速度与平均水平相比如何?他有没有得到一堆可怜的分数,然后突然变得不可思议?我的服务器是否看到此用户的异常命中模式?等。

您可以对此进行设置,以便逐步优化检测算法,并在对玩家产生怀疑(以及取消黑名单误报)后将其列入黑名单。