Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 防止网上街机高分板作弊_Javascript_Html - Fatal编程技术网

Javascript 防止网上街机高分板作弊

Javascript 防止网上街机高分板作弊,javascript,html,Javascript,Html,我将为HTML5/Javascript游戏开发一个在线游戏机,该游戏机是用即将发布的IDE编写的 当人们玩这些游戏时,游戏将使用Ajax请求服务器来记录分数 从理论上讲,我完全可以控制这个游戏的设计,包括记录高分的代码机制、游戏代码等等 我知道破解这样的客户端游戏或欺骗高分从来都不是不可能的,但我想让它变得足够困难,这样任何有能力的人都不会被打扰去做(一厢情愿) 我读过: 这是一个稍微不同的问题,因为这是特定于HTML/JS的 我最初的想法是ajax请求检查请求源是否来自正确的位置,这对于大多

我将为HTML5/Javascript游戏开发一个在线游戏机,该游戏机是用即将发布的IDE编写的

当人们玩这些游戏时,游戏将使用Ajax请求服务器来记录分数

从理论上讲,我完全可以控制这个游戏的设计,包括记录高分的代码机制、游戏代码等等

我知道破解这样的客户端游戏或欺骗高分从来都不是不可能的,但我想让它变得足够困难,这样任何有能力的人都不会被打扰去做(一厢情愿)

我读过:

这是一个稍微不同的问题,因为这是特定于HTML/JS的


我最初的想法是ajax请求检查请求源是否来自正确的位置,这对于大多数黑客尝试来说是一个简单而有效的阻止

正如前面的回答所说,你不能信任客户,因此你最好的办法是将游戏分成不同级别,并让服务器控制级别。如果服务器正在跟踪每个客户端及其进度,则可能会限制可获得的分数范围。这使得作弊变得更加乏味,因为客户端必须模拟通过每个级别,并在正确的分数范围内指出成绩。

这里有一种方法,实现起来非常简单(虽然不是很简单),而且很难破解,而且破解起来也不那么简单

在服务器端,将1000个项目的列表存储在文本文件或数据库中

每个项目都是唯一的GUID或其他唯一的长字符串,让我们调用每个项目
key

现在,当您发送AJAX请求时,请同时发送其中一个键。。它可以是列表中的随机数,也可以通过增加索引来实现,这无关紧要

现在是好的部分:在每个密钥“使用”一次后(意味着服务器使用该密钥获得请求并响应该请求),从文件/数据库中删除该密钥。如果服务器使用列表中不存在的密钥获取请求,当然会抛出错误或返回“no hacking”字符串

当列表变为空时,使用新的唯一键重新创建它

这样,第一个使用真实密钥的请求应该像往常一样成功,但是如果用户再次尝试调用相同的请求,那么它将失败。假设这些键是长随机值,猜测这些键也是非常困难的


和其他方法一样,它也有缺陷,因为它依赖于客户端代码,而客户端代码可能会被知道如何使用的人欺骗。但由于它并不常见,普通人将很难找到它的工作原理并破解它。

这并不适用于所有游戏,但

如果在每一帧上记录所有控制输入,并在级别开始时记录RNG种子,则可以通过重播控制器输入重新运行级别,并获得完全相同的事件序列。这可以用来验证游戏是否真的进行过,分数是否只是虚构的。验证每一场游戏的成本都会很高,但还有其他选择,例如,如果分数在前100名,则只验证一场游戏;如果验证失败,则测试随机游戏并禁用帐户


然后坐下来,看着作弊者开始用机器人代替他们玩,这更难防范。

添加md5高分代码哈希,并在服务器上进行比较。但是,不要将md5精确地定义为highscore,不要在highscore的所有字符上仅定义部分字符,比如倒数第二个字符。在这种情况下,当只跟踪ajax调用时,很难看到md5由什么组成

每次服务页面时,都会包含一个随机生成的密钥,并在服务器上将该密钥与用户会话关联起来

在游戏脚本中的各个点上传递此键并以模糊的方式操纵它

生成从分数和被操纵的关键点派生的校验和

将校验和与分数一起发送到服务器

在服务器上验证校验和

混淆脚本


但是,它不会阻止一个专门的黑客。

对不起,正确的位置和任何其他参数一样可以被欺骗。使用用户端脚本非常简单(比如Greasemonkey)——只需将代码添加到客户端代码,但它仍然会从您的页面(位置)运行。我真的不明白这是如何安全的。我是说,什么能阻止假客户发送假高分?编辑:或者至少,这有多难?@ybo:客户端可以发送他想要的任何分数,但如果没有有效密钥,服务器将忽略它。客户端如何知道它必须发送哪个密钥?它必须从(或请求)客户端计算,因此它可以被伪造…@andre good call。。我猜这是第一个陷阱——让我想想,我会带着一些东西回来。是什么阻止客户获得有效的分数+密钥,然后只在提交分数+密钥对之前更改分数?这个“答案”是有缺陷的。黑客非常容易。它确实不会阻止专门的黑客——他只是在你校验和发送它之前更改highscore变量。但这仍然允许其他用户通过发送带有先前生成的哈希的请求来获得相同的分数。