在Javascript中进行黑客validation游戏

假设您使用HTML5 / JavaScript创build了一个在线游戏。 所有的代码将被下载到用户浏览器,他们将运行游戏。

什么是阻止某人将游戏复制到他们的计算机,并注入function和模块作弊? 例如,他们可以编写一个自动瞄准最近的敌方精灵的函数。

有没有什么基本的方法来保护人们通过以某种方式devise游戏代码来做这种事情?

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

没有。

有没有什么基本的方法来保护人们通过以某种方式devise游戏代码来做这种事情?

不。

这就是为什么大多数JavaScript游戏严重依赖 服务器状态 ,以防止作弊。

总之,没有。 但是,您可以混淆Javascript ,使其更加困难。

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

一些想法

服务器端:

  • 存储游戏内部状态服务器端并检查服务器上客户端发送的input。

  • Autoaim :创build一些普通玩家看不见的假精灵,如果他们被打得太频繁,你会有一个机器人。 (不会总是工作,机器人可能会更新,以检查隐形)

  • 检查客户端反应时间到服务器上的变化,检查太多太快​​的反应。 (必须先接受大量的快速响应,然后再作出反应,因为人类可能会作出快速的反应,并且时间必须考虑到networking延迟的问题)。 给玩家一些validation码,普通玩家永远不会看到。

客户端:

  • 使用混淆使其难以与您的代码进行交互

  • 检查你知道的黑客中定义的函数。 必须经常修改/更新,因为这些黑客的创造者可以解决这些问题。

  • 游戏devise:使你的游戏重复性更低,这使得编写工具/机器人更加困难。

  • 更新客户端以不时更改其结构的一部分。 虽然这不会阻止机器人,但要花时间让它们继续运行。 要么让用户看起来透明,要么用新的function来掩饰它。

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

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

  • 混淆。 是的,这是不能保证的,有人可以最终得到它,但有时候处理是一个痛苦的屁股。
  • 每次生成一个新的临时令牌的JS。 您可以对运行代码的.js进行模板化,并插入一个服务器生成的令牌,每个实例都有所不同。 令牌可能是临时的,它可能是validation代码真实性的一种方法
  • 可能有一些方法可以确定正在运行的脚本的正确位置 – 但这可能是伪造的

一般来说,它的努力,上面的所有build议都可以解决。 我想关键是要让他们难以作弊,但是鉴于即使是安全的在线模式游戏也有欺骗者,所以要阻止JS游戏也容易受到攻击。

有没有什么基本的方法来保护人们通过以某种方式devise游戏代码来做这种事情?

唯一的方法是将代码中的关键代码保存在您控制的服务器上,而不要将代码放到用户的计算机上。 最难的部分是让这个方块保持足够的速度以便可以玩游戏。

你试图做不可能的事情 我可以给你的最好的build议是,如果你打算坚持像硬币/金钱/黄金,水平的数据,你不能确信你永远不会相信客户端,并尽可能多的逻辑服务器。

我认为要走的路是以这样一种方式编写客户端,即dynamic更改客户端代码并validation在服务器上使用如此创build的代码。

例如有一个像这样的名字空间

window.mynamespace = { foo : function(){ // some stuff here }, bar : function(){ // some more stuff here } } 

其中包含您所有的客户端代码,并使您的所有服务器方法都需要一个令牌,这是先前代码库dynamic评估的结果。 通过重新定义方法和更改方法名称来更加困难。 以下是一些示例挑战(如果挑战是dynamic创build的而不是可预测的,则这只是有意义的)。 所有包含一个任务,然后是一个挑战,将用于创build下一个请求的授权令牌。 (这些是来自ajax调用的响应对象)。 基本上任务将被评估,并且被挑战的挑战的结果将是下一个标志。

 { 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模拟层。 虽然可以这样做,但是我会尽量使基本的服务器代码发生变化,使这种技术几乎不可能(所以仿真层不知道要模拟什么)。

他们可以编写一个函数,例如在最近的敌方精灵中自动运行。

你甚至可以做到这一点,大多数处理发生在服务器端的游戏! 你只需要快速分析显示。

你甚至可以重新实现游戏AI的一部分,试图预测机器人将如何移动。 如果您无法访问游戏的源代码,这不是一件容易的事情,但如果您logging了大量游戏时间,则可以使用机器学习技术。

有没有什么基本的方法来保护人们通过以某种方式devise游戏代码来做这种事情?

不要忘记,你可以改变游戏本身 ,而不仅仅是如何实现。 例如,使用随机生成的级别而不是静态的级别,使用人类玩家而不是僵尸,使你的艺术/精灵更复杂,更多地使用audio,限制光标移动的速度,增加冷却时间武器,添加隐患等等。

理论上你正在玩黑客的游戏。 你不能赢得这场比赛,但你使它具有挑战性。

我的build议是使用尽可能多的服务器端逻辑,你可以使用和使用Javascript混淆。

Javascript混淆会使代码难以理解,但更好的是,它可以让您在保持相同代码基础的同时发布数千个代码版本。

我曾经使用过JScrambler来做这件事。 黑客不必破解1个游戏的代码,而必须破解数千个代码版本! 🙂

你可以把所有的代码都调用到闭包中:

 (function() { var cantSeeMe = function() { // do some game stuff! }; })(); 

在closures之外,很难获得“注入黑客”的代码(例如在控制台上重写一个函数)。 这不会阻止某人重写你的代码,而是通过一个包装器,甚至闭包编译器传递的东西,可以使你的代码很难读/修改…(看看jQuery的最小

总而言之,任何运行游戏的客户端都是可以被破解的。

travian( http://www.travian.us/ )是DHTML中运行的大型游戏的一个很好的例子,它存在大量的客户端滥用问题。 只要在Firefox中安装油猴,就会为各种剥削行为开辟一扇大门。 也就是说,他们似乎保持了游戏的有些function,因为大部分的攻击似乎围绕着游戏中常见任务的自动化,而不是直接违反游戏的内部逻辑。 请记住,这个例子远远没有运行只有JS和主要依赖于服务器端控件。

免责声明 :这是一个可怕的方法,可能比它值得太多的努力。

假设你有一个处理 JavaScript代码的方法,然后再发送它。

首先,每个方法都有一个identvariables附加到每个函数的结果(即每个函数都会返回{ident:"special code",result:"actual useful function result"} ))。 你也有一个testIdent()函数,它可以接受调用的函数名称以及“testing数据”给它(如果有的话)。 testIdent()的目的是testIdent()函数返回的标识符发送到服务器进行validation(这个想法是服务器可以在你认为合适的时候请求testing)。 每个function的标识都应该在发送前专门为指定的用户进行随机化和logging。

其次,在代码发送到客户端之前,函数顺序是随机的,函数名称在某些随机事件中被模糊处理。 这样黑客就无法在函数x()中寻找variablesident ,因为它将被随机命名。 另外,如果每个variables的名字都是随机混淆的话,那么还有另外一个好处,那就是为了增加又一个步骤来避免复杂性和头痛…所有人(我告诉过你这是一个可怕的方法)。

现在,假设采取了适当的步骤来确保代码始终正常工作,黑客就是非常聪明的人,如果他们有足够的判断力,黑客们仍然有办法跟踪这些代码。 至less有一种方法是search关键的代码结构,比如带有一定数量的元素的switch语句,或者带有x个语句的for循环等等。虽然每一个都可以被反驳,在交换机中的语句或者在整个代码中随机select几个if(true)位,反黑客永远是一个不变的(也可能是松动的)战斗。

希望这可以给你一些想法。 我不知道有人会如何实现这一点,但至less是一个想法。

祝你好运!