在基于JavaScript的游戏中制作在线高分列表的最佳实践是什么?

在基于JavaScript的游戏中制作在线高分列表的最佳实践是什么?,javascript,Javascript,[我知道在防止高分列表作弊方面也有类似的问题,但没有答案对基于JavaScript的游戏没有帮助,所以在告诉我类似帖子之前,请试着想想我的问题。我问的是最佳实践,因为JavaScript对用户来说总是可见的,因此它是n要完全防止作弊是不可能的,我只想让它变得更难。] 我正在开发一个在浏览器中运行的基于JavaScript的游戏。我想制作一个高分列表,其中包含所有用户的用户名和分数。为了实现这一点,浏览器将用户名和分数发送到我的服务器(通过AJAX) 将假分数提交到此列表相当容易:可以查看AJAX

[我知道在防止高分列表作弊方面也有类似的问题,但没有答案对基于JavaScript的游戏没有帮助,所以在告诉我类似帖子之前,请试着想想我的问题。我问的是
最佳实践
,因为JavaScript对用户来说总是可见的,因此它是n要完全防止作弊是不可能的,我只想让它变得更难。]

我正在开发一个在浏览器中运行的基于JavaScript的游戏。我想制作一个高分列表,其中包含所有用户的用户名和分数。为了实现这一点,浏览器将用户名和分数发送到我的服务器(通过AJAX)

将假分数提交到此列表相当容易:可以查看AJAX请求,然后使用假分数创建自己的AJAX请求。使用类似于
令牌的东西,必须与其他数据一起发送,这是毫无意义的,因为很容易发现

我唯一能防止作弊的方法是向服务器发送每个用户操作的描述,并在那里计算分数。但这实际上并不可行,因为这对服务器来说太多了


我接受了一个答案,但如果有人对如何使作弊更难有其他想法,请创建另一个答案!你几乎回答了你自己的问题。如果你想真的让用户更难作弊,请将游戏日志发送到服务器,在那里你将计算分数

您不必发送所有事件,只需发送影响结果分数的事件

不过,有一些技巧可以帮助您:

  • 在您的请求中包含签名。类似于MD5(secret_key+params)。尽管“secret key”必须在JS源代码中,但它将有效地保护您免受简单请求拦截(请参阅和)

  • 如果是多人游戏,接受客户计算的分数并进行比较。作弊者将非常明显(假设大多数用户是诚实的)

  • 你可以设置一个分数上限,这是一个“无法达到”的结果。每个发布分数高于此值的人都是骗子。例如,快速打字游戏:没有人能以1500字符/分钟的速度键入正确的文本,即使700字符/分钟也非常难(尽管可以实现)


我喜欢玩作弊游戏-类似于使用令牌来验证每次调用更新时更改的分数…但我接受使用重复令牌发布的作弊分数。然后我只向作弊者显示该作弊分数,因此它似乎有效,但现在作弊者在sa中看到了他的结果ndbox.

关于分数提交:

  • 从服务器请求一些令牌,这应该是基于时间的,并且仅在大约2秒钟内有效
  • 仅接受包含此令牌的有效哈希、一些salt和分数的提交
  • 这可以防止手动篡改请求,因为这会使分数超时。如果您想解释高延迟,请在超时之前给它多一点时间

    散列函数:

    对压缩代码中的哈希函数进行置乱(http://dean.edwards.name/packer/ 如果使用jQuery或其他库,只需在库文件中删除散列功能,就很难找到它,特别是如果使用函数名“h”:

    处理分数变量本身:

    每个拥有调试控制台的人都可以在运行时更改变量,但如果将整个Javascript封装在一个函数中并调用它,则全局命名空间中没有任何内容,并且很难访问变量:

    (函数(){
    //你的js代码在这里
    })();
    
    根据游戏的性质,您可以使用其他玩家来验证结果。在简单游戏中,这非常有效,在其他游戏中,您必须聪明,并围绕此功能开发许多方面。例如,有时可以根据记录的动作重播和验证结果。此技巧特别适用于人类与AI的对抗,例如ng,因为模型是确定性的

    另一个选择是重新定义分数概念,使其更以用户为中心,这很容易实现,但往往很难设计,并且只适用于少数类别的游戏

    纯粹的推测方法也是可能的,有时很容易知道某些参数不合适。这不会避免作弊,但会大大缓和作弊

    最复杂的部分是获得一个足够小的回放日志,但由于大多数数据不是随机的(除了玩家的动作,实际上不是随机的,因为这取决于游戏),因此本质上是一个正确设计的问题


    此外,如果游戏的可玩性得到了足够的扩展,对于动作游戏之类的游戏,你可以通过进行一些近似、合并(例如运动矢量)来获得大量的压缩我对此有很多想法,最终决定只获得当地的个人高分,所以作弊对玩家并没有真正的好处,对其他人也没有害处。然而我的游戏很简单,有人抱怨没有竞争桌

    选项2,是一种显示你在“互联网人群”中的位置的方法。这样你就看不到任何其他结果,人们也看不到你的结果,但你可以将自己与人群进行比较


    p、 s:说真的,任何一个有Firebug/WebInspector的孩子都可以轻松破解你的JS游戏,最终能够获得非常高的分数。

    理想情况下,你可以将整个事件日志发送到服务器进行检查。也许你可以实施一种启发式方法,以便轻松确定分数是否在一组界限内。例如,如果tal游戏时间为5秒,您可能会期望
    req number, curr time, score