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

js-*_*der 25 javascript

[我知道有关防止在高分榜上作弊的类似问题,但没有答案对我基于JavaScript的游戏没有真正的帮助,所以在告诉我类似的帖子之前,请尝试考虑我的问题.我问,best practices因为JavaScript总是对用户可见,因此不可能完全防止作弊,我只是想让它变得更难.

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

将虚假分数提交到此列表将非常简单:可以查看AJAX请求,然后使用伪造的分数制作自己的AJAX请求.使用token必须与其他数据一起发送的东西是毫无意义的,因为它很容易被发现.

我唯一可以防止作弊的方法是将每个用户操作的描述发送到服务器并计算其中的分数.但这并不是真的可行,因为它对服务器来说太过分了.

我接受了一个答案,但如果有人对如何使作弊更难有其他想法,请创建另一个答案!

Mat*_*t H 16

我喜欢欺骗骗子 - 就像使用令牌来验证每次调用更新时更改的分数......但我接受使用重复令牌发布的作弊分数.然后我将该作弊分数显示给骗子,所以看起来它有效,但现在骗子在沙盒中看到了他的结果.

  • 这绝对有利于拒绝一些伪造的分数,但我认为这不会阻止许多骗子.人们可以阻止第一个请求,并使用令牌作为请求与作弊分数. - 虽然好主意+1! (2认同)

Ser*_*sev 13

你几乎回答了自己的问题.如果你想真正让用户更难欺骗,发送游戏登录到服务器,在那里你会计算得分.

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

但是,有一些技巧可以帮助您:

  • 在您的请求中包含签名.像MD5(secret_key + params)之类的东西.虽然,"秘密密钥"必须在JS源代码中,它将有效地保护您免受简单请求拦截(请参阅Tamper DataCharles)

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

  • 你可以设置一个分数上限,一个"无法到达"的结果.发表得分高于此的每个人都是骗子.例如,速度打字游戏:没有人可以以1500字符/分钟的速度输入正确的文本,甚至700也很难(尽管可以实现).

  • 这并不重要,但你的得分上限是一个不好的例子.很多人用刻度线可以打破1500个字符/分钟,并且出于某种原因,那些人喜欢去打高分列表的网站. (2认同)
  • 现代速记器(有经验丰富的速记员)输出真实,正确,精确的英语.我实际上知道一个事实,即至少有一个打字网站从插入计算机的速记器中获取大量合法分数.所以...只是说...... (2认同)

bar*_*iir 5

提交分数:

  1. 从服务器请求一些令牌,这应该是基于时间的,并且仅在大约2秒内有效
  2. 只接受包含此令牌的有效散列,某些盐和分数的提交.

这可以防止手动篡改请求,因为它会使分数超时.如果您想考虑高延迟,请在超时前给它一点时间.

散列函数:

抢哈希函数里面挤满码(http://dean.edwards.name/packer/真的产生讨厌阅读代码),如果你使用jQuery或其他一些图书馆刚落库文件中的散列功能和它变得非常糟糕查找,特别是如果你使用像"h"这样的函数名称:)

处理得分变量本身:

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

(function() {
  //your js code here
})();
Run Code Online (Sandbox Code Playgroud)

  • 它根本不会阻止作弊,它足以复制和粘贴一些代码. (2认同)