当前位置:  开发笔记 > 编程语言 > 正文

在Javascript中制作黑客证明游戏

如何解决《在Javascript中制作黑客证明游戏》经验,为你挑选了8个好方法。

假设您使用HTML5/JavaScript创建了一个在线游戏.所有代码都将下载到用户的浏览器中,然后他们就会运行游戏.

你如何阻止某人将游戏复制到他们的计算机上,并注入功能和模块作弊?例如,他们可以编写一个自动瞄准最近的敌人精灵的函数.

是否有任何基本方法可以通过以某种方式设计游戏代码来保护人们不会做这类事情?



1> JSBձոգչ..:

什么阻止某人将游戏复制到他们的计算机上,并注入功能和模块作弊?

没有.

是否有任何基本方法可以通过以某种方式设计游戏代码来保护人们不会做这类事情?

不.


@JS Bangs:你的答案是错误的,没有受过教育,这会伤害阅读.与你相反,我**曾在(商业)电脑游戏行业工作.像暴雪的大片"魔兽争霸III"这样的游戏正在复制服务器端的整个游戏状态,并且只传输玩家所做的输入.通过发送无效的游戏状态在Battle.net上玩是不可能的.除此之外,如果一个"机器人"伪造输入,有一个*很多的启发式允许捕获机器人,并且有定期的许可证密钥为**被破坏**"僵尸"目的无效.你只是错了.
几周前,谷歌正在做一些有趣的工作来保护他们的Pacman游戏.
@Webinator - 你暗示自己人们会弄清楚如何制作机器人,对我而言,这只会强化JS Bang的答案的第一部分.你继续说有很多用于捕捉僵尸程序的启发式算法,这让我感觉非常具体,而且对游戏本身的设计并不重要.所有你证明的是,它可以*威慑*作弊,并且通过大量的开发投资,可以最大限度地减少作弊.
您可以花费大量精力来混淆代码以使其更难,但正如@ js-bangs指出的那样,功能上没有办法完全阻止它.如果它在客户端运行,则客户端拥有它并可以对其进行修改.
@Webinator,我也假设我们正在谈论一个主要或完全客户端的JavaScript游戏.显然,如果你把整个游戏状态的服务器上,回来后每个用户的动作,可以减少作弊,但是这并不是说我相信OP被描述的情况.
@Chris Steward:但与此同时,谷歌的PacMan就是一个很好的例子,即使是最困难的混淆也无法最终阻止人们复制它.毕竟,人们能够保存它.

2> Luca Matteis..:

这就是为什么大多数的JavaScript游戏依靠大量服务器状态,以防止作弊.


其他每一个答案都说*它无法完成,*这当然是错误的.它可以完成 - 只需在服务器上进行所有计算.这引入了滞后,这使得实时游戏变得困难.您想要的实时性越多,您必须牺牲的安全性就越高(所有游戏都是如此,而不仅仅是javascript游戏)
BlueRaja:那怎么会禁止一个人写一个自动生成最近的精灵的函数?好吧,它使得像wallhacks更难的东西,但用户输入仍然可以伪造,输出仍然可以解析和显示不同.

3> DisgruntledG..:

简而言之,没有.但是,您可以对Javascript进行模糊处理以使其变得更加困难.

对于像分数这样的东西,用户理论上可以将任何分数发布到处理程序脚本中.在这种情况下,您可以使用会话并定期通过AJAX回发到服务器.


对于有意黑客攻击或欺骗浏览器多人游戏的人来说,直截了当,我认为这是OP所关心的.

4> josefx..:

一些想法

服务器端:

存储游戏内部状态服务器端并检查服务器上客户端发送的输入.

Autoaim:创建对正常玩家不可见的假精灵,如果他们经常被击中你有一个机器人.(并不总是有效,因为机器人可能会更新以检查隐身)

检查客户端对服务器更改的反应时间,检查太多反应太快.(必须接受大量快速响应才能做出反应,因为人类可以快速反应,时间必须考虑网络延迟以捕获任何东西).给玩家一些验证码,普通玩家永远不会看到它.

客户端:

使用模糊处理使代码更难以与代码进行交互

检查你知道的黑客中定义的功能.必须经常修改/更新,因为这些黑客的创建者可以解决这些问题.

游戏设计:让你的游戏重复性降低,这使得为它编写工具/机器人变得更加困难.

更新客户端以不时更改其结构的一部分.虽然这不会阻止机器人,但仍需要工作才能让它们继续运行.使其对用户透明或使用新功能对其进行伪装.

重要提示:确保您的服务器接口检查用户输入,混淆和客户端检查不会帮助编写自己客户端的人.



5> NG...:

我喜欢这个问题,虽然可能有更好的答案,但这里有一些可能(或可能不)工作的问题:

混淆.是的,它没有保证,有人最终可以得到它,但有时候处理的屁股很痛苦.

每次使用新的临时令牌生成JS.您可以对运行代码的.js进行模板化,并插入每个实例不同的服务器生成的令牌.令牌可能是临时的,它可能是验证代码真实性的一种方法

可能有一些方法可以确定正在运行的脚本的正确位置 - 但这可能是伪造的

总的来说,它的难度和上述所有建议都可以解决.我想关键是要让他们很难作弊,但考虑到即使是安全的在线模式游戏也有作弊者,也很难阻止JS游戏受此影响.



6> Donal Fellow..:

是否有任何基本方法可以通过以某种方式设计游戏代码来保护人们不会做这类事情?

唯一合理的方法是将代码的关键部分保存在您控制的服务器上,并且根本不会将其提供给用户的计算机.困难的部分是制作这个方块,保持游戏足够快,可玩.



7> Christopher ..:

你正试图做不可能的事.我能给你的最好的建议是,如果你打算坚持像硬币/金钱/金币,等级这样的数据,那么你要确保你永远不要相信客户并尽可能多地建立逻辑服务器.



8> Sean Patrick..:

我认为可行的方法是以一种方式编写客户端,以便动态更改客户端代码并验证在服务器上使用如此创建的代码.

例如,有这样的命名空间

window.mynamespace = {

    foo : function(){
        // some stuff here
    },

    bar : function(){
        // some more stuff here
    } 
}

它包含您的所有客户端代码,并使您的所有服务器方法都需要一个令牌,该令牌是先前对代码库进行动态评估的结果.通过重新定义方法和更改方法名称来加倍努力.以下是一些示例挑战(只有在动态创建挑战并且无法预测时才有意义).所有都先包含一个任务,然后是一个挑战,用于为下一个请求创建授权令牌.(这些是来自ajax调用的响应对象).基本上,任务将被评估,并且eval'd挑战的结果将成为下一个标记.

{
    task: "mynamespace.baz=mynamespace.foo;mynamespace.foo=undefined;",
    challenge: "mynamespace[11].toString().substr(10,22)"
            // get part of a well-known functions source code
}

{
    task: "mynamespace.bar=function(){ /* new code here */ }",
    challenge: "var xy=0;mynamespace.each(function(item){xy+=item.toString().lastIndexOf(';')}); xy"
            // accumulate the last index of a semicolon in all elements
            // of the namespace
}

为了击败它并仍然获得有效的授权令牌,客户端必须编写整个javascript仿真层.虽然可以这样做,但我会尝试经常以基本方式更改服务器代码,以使这种技术几乎不可能(因此仿真层将不知道要模拟的内容).

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有