我将开发一个用于在即将发布的IDE中编写的HTML5 / Javascript游戏的在线游戏。
当人们玩这些游戏时,游戏将使用Ajax请求到服务器来记录分数。
理论上我完全控制了它的设计,包括记录高分,游戏代码,一切的代码的机制。
我知道攻击像这样的客户端游戏或欺骗高分并不是不可能的,但我想让它变得足够困难,以便任何有足够能力的人都不会被打扰(一厢情愿)。
我读过:
How can you prevent bogus high scores from appearing on a global high score list?
这是一个略微的不同问题,因为这是HTML / JS特定的。
我最初的想法是,ajax请求检查请求的来源是否来自正确的位置,这对于大多数黑客攻击都是一个简单而有效的阻止。
答案 0 :(得分:3)
正如之前的回答所说,你无法信任客户,因此最好的办法是将游戏分成某种级别并使服务器控制级别进展。如果服务器正在跟踪每个客户端及其进展,则可以限制可实现的分数范围。这使得欺骗更加繁琐,因为客户必须模拟通过每个级别并在正确的分数范围内表明成就。
答案 1 :(得分:3)
每次为页面提供服务时,都会包含一个随机生成的密钥,并在服务器上将密钥与用户会话相关联。
传递此密钥并在游戏脚本的各个点以不明显的方式操纵它。
生成从得分和操纵键派生的校验和。
将校验和连同分数
一起发送到服务器验证服务器上的校验和
模糊脚本
但它不会阻止专门的黑客。
答案 2 :(得分:2)
这是一种非常简单(虽然不是微不足道)实现并且非常难以入侵并且不那么容易破解的方法。
在服务器端,有一个列表,假设存储在文本文件或数据库中的1000个项目。
每个项目都是唯一的GUID或其他唯一的长字符串,让我们调用每个项目key
。
现在,当您发送AJAX请求时,也会发送其中一个密钥..它可以从列表中随机出现,也可以通过递增索引来控制它。
现在出现了很好的部分:在每个键的一次“使用”之后(意味着服务器通过该键获得请求并对其进行响应),从文件/数据库中删除密钥。如果服务器使用列表中不存在的密钥获取请求,当然会抛出错误或返回“no hacking”字符串。
当列表变空时,使用新的唯一键重新创建它。
这样,使用真实密钥的第一个请求应该像往常一样成功,但如果用户尝试再次呼叫相同的请求,它将失败。假设这些是长随机值,猜测键也很难。
与其他任何方式一样,它存在缺陷,因为依赖于客户端代码,这些代码可能会被知道如何操作的人欺骗。但由于这种情况并不常见,因此普通民众更难以找到它的工作方式并将其破解。
答案 3 :(得分:2)
这不适用于所有游戏,但......
如果您在每个帧上记录所有控制输入,并且还在级别的开始处记录RNG种子,则可以通过重放控制器输入来重新运行该级别并获得完全相同的事件序列。这可用于验证游戏是否实际播放并且分数不仅仅是弥补。验证每个游戏都会很昂贵,但还有其他选择,例如只有在得分排在前100位时验证游戏,或者在验证失败时测试随机游戏并禁用帐户。
然后坐下来观看作弊者开始使用机器人代替他们玩,这更难以防御。
答案 4 :(得分:1)
添加高分代码的md5哈希并在服务器上进行比较。但是md5并不是高分榜,而不是高分榜的所有角色,只有一些角色,比如倒数第二个。在这种情况下,当仅跟踪ajax调用时,很难看到md5包含的内容。