假设您使用HTML5/JavaScript创建了一个在线游戏.所有代码都将下载到用户的浏览器中,然后他们就会运行游戏.
你如何阻止某人将游戏复制到他们的计算机上,并注入功能和模块作弊?例如,他们可以编写一个自动瞄准最近的敌人精灵的函数.
是否有任何基本方法可以通过以某种方式设计游戏代码来保护人们不会做这类事情?
什么阻止某人将游戏复制到他们的计算机上,并注入功能和模块作弊?
没有.
是否有任何基本方法可以通过以某种方式设计游戏代码来保护人们不会做这类事情?
不.
这就是为什么大多数的JavaScript游戏依靠大量在服务器状态,以防止作弊.
简而言之,没有.但是,您可以对Javascript进行模糊处理以使其变得更加困难.
对于像分数这样的东西,用户理论上可以将任何分数发布到处理程序脚本中.在这种情况下,您可以使用会话并定期通过AJAX回发到服务器.
一些想法
服务器端:
存储游戏内部状态服务器端并检查服务器上客户端发送的输入.
Autoaim:创建对正常玩家不可见的假精灵,如果他们经常被击中你有一个机器人.(并不总是有效,因为机器人可能会更新以检查隐身)
检查客户端对服务器更改的反应时间,检查太多反应太快.(必须接受大量快速响应才能做出反应,因为人类可以快速反应,时间必须考虑网络延迟以捕获任何东西).给玩家一些验证码,普通玩家永远不会看到它.
客户端:
使用模糊处理使代码更难以与代码进行交互
检查你知道的黑客中定义的功能.必须经常修改/更新,因为这些黑客的创建者可以解决这些问题.
游戏设计:让你的游戏重复性降低,这使得为它编写工具/机器人变得更加困难.
更新客户端以不时更改其结构的一部分.虽然这不会阻止机器人,但仍需要工作才能让它们继续运行.使其对用户透明或使用新功能对其进行伪装.
重要提示:确保您的服务器接口检查用户输入,混淆和客户端检查不会帮助编写自己客户端的人.
我喜欢这个问题,虽然可能有更好的答案,但这里有一些可能(或可能不)工作的问题:
混淆.是的,它没有保证,有人最终可以得到它,但有时候处理的屁股很痛苦.
每次使用新的临时令牌生成JS.您可以对运行代码的.js进行模板化,并插入每个实例不同的服务器生成的令牌.令牌可能是临时的,它可能是验证代码真实性的一种方法
可能有一些方法可以确定正在运行的脚本的正确位置 - 但这可能是伪造的
总的来说,它的难度和上述所有建议都可以解决.我想关键是要让他们很难作弊,但考虑到即使是安全的在线模式游戏也有作弊者,也很难阻止JS游戏受此影响.
是否有任何基本方法可以通过以某种方式设计游戏代码来保护人们不会做这类事情?
唯一合理的方法是将代码的关键部分保存在您控制的服务器上,并且根本不会将其提供给用户的计算机.困难的部分是制作这个方块,保持游戏足够快,可玩.
你正试图做不可能的事.我能给你的最好的建议是,如果你打算坚持像硬币/金钱/金币,等级这样的数据,那么你要确保你永远不要相信客户并尽可能多地建立逻辑服务器.
我认为可行的方法是以一种方式编写客户端,以便动态更改客户端代码并验证在服务器上使用如此创建的代码.
例如,有这样的命名空间
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仿真层.虽然可以这样做,但我会尝试经常以基本方式更改服务器代码,以使这种技术几乎不可能(因此仿真层将不知道要模拟的内容).