【问题标题】:Prevent Javascript games tweaking/hacking防止 Javascript 游戏调整/黑客攻击
【发布时间】:2011-06-12 08:41:07
【问题描述】:

由于最近浏览器的增强,使用 canvas 和 javascript 开发游戏已成为一个不错的选择,但现在代码很容易访问,只需编写即可

javascript:score=99999

javascript:lives=99

会破坏游戏目标。

我知道通过一些服务器端检查可以完成某些事情,但我更愿意访问服务器只是为了在最后存储玩家统计数据,或者在大多数情况下甚至只使用客户端。

我想知道是否至少有一些最佳实践可供开始。

(使用不那么明显变量名称是一个开始,但还不够)

-已添加-

感谢您的回复,我正在寻求改进客户端代码,足以阻止“临时黑客”,但仍使代码尽可能干净。 任何真正想要破解它的人无论如何都会成功,即使通过服务器端检查,正如我在许多 Flash 游戏中看到的那样。

【问题讨论】:

  • 理论上不可能,但我更喜欢的方式是(function(){/*insert your code here*/}());
  • 更好的问题要问:你真正想防止谁和什么?谁是您的受众,为什么防止作弊对您的目标很重要?最后,您可能想问,他们是否作弊真的很重要(如果他们真的想的话);最终可能会允许修改甚至可以为您的受众改进您的产品。
  • 例如:整个网站都使用经过修改的 Flash 游戏进行欺骗,并获得广告支持的收入。那里有市场。既然您甚至可以从中受益,或者阻止其他人从您的客户缺乏技术知识中受益,为什么还要费心去阻止它?
  • 你是对的,在大多数情况下,这根本不是问题,只是想一个简单的在线记分牌。作弊会让它毫无用处。

标签: javascript


【解决方案1】:

我会说我在评论中所说的:将每个源代码放在(function(){ }()); 中。然后,无法从外部访问变量和函数。

例子:

(function(){
    var a = 'Foo';
    var b = 42;
    function helloWorld(a,b){
        for(i=0;i<b;i++)console.log(a);
    }
    helloWorld(a,b);
});
//Can't access to a, b, or helloWorld using javascript: or default console of Google Chrome,
//but people still can see by looking source code and may be modified by other tools
//(see comments of Tom & user120242)

当我深入研究 Les Paul Google Doodle 时,我“学习”了这项技术。

为了更安全(不是完全安全,但会惹恼一些黑客),请使用 YUI compressorpacker 之类的工具压缩和混淆您的脚本。

【讨论】:

  • 这是正确的做法。因为它是一个未命名的自调用函数,您以后无法访问它们。并且所有变量都存储在函数上下文中,无法从外部访问。
  • 这篇文章暗示这些变量和函数永远不能从外部访问,这显然是错误的,因为代码在客户端可用,这意味着可以根据需要访问任何内容。需要一台有权使任何事情接近安全的服务器。
  • @eskimoblood @JiminiP @Tom 我可以给你一个改变这些值的例子而不修改代码。拉起 Javascript 开发控制台并在“var b=42;”上设置断点,然后当断点出现时,在 JS 控制台中键入“a=b=999999999”。任何人都可以轻松做到这一点。
  • @user120242:谢谢。我不知道那个..:P
【解决方案2】:

一种方法是将每次移动的记录也发送到服务器,然后验证这些移动是否会获得该分数。

这对于单人纸牌或国际象棋等游戏来说很容易,但对于更复杂的游戏则不然。

一个更简单的版本是计算每秒或每次移动可以获得的最大分数,然后验证分数不高于你的理论最大值。

另一种方法是将每次移动记录在服务器上,并在服务器上计算得分。这意味着游戏结束时没有发送,并且这些变量仅用于显示,而不是实际得分。

离线游戏可以在高分表上加星标或其他内容以表明它们未经验证。

值得指出的是,对于任何 javascript 调试器,例如 Webkit 中的 Inspector、Firefox 中的 Firebug 或 Opera 上的 Dragonfly,即使您的代码处于闭包中,在客户端更改变量的值也是微不足道的。任何形式的混淆都是没有意义的,因为在玩游戏时很容易观察哪个变量对应于分数,以及任何编码或任何内容都可以简单地从代码中读出。

【讨论】:

  • 这可能是真的,但 OP 明确表示不想在服务器上进行计算,并暗示他只是想让计算变得更加困难。以不明显的方式改变值(例如以交替位顺序编码值和编码字符串)和混淆代码会使它变得更加困难。
  • 另外值得注意的是,可以说即使是基于服务器的反作弊也有限制。它可能是最好的解决方案,但不一定是最佳的功效/成本比,视情况而定。我可以非常自信地告诉您,您实施的任何事情我都可以在一天内绕过。例如只是通过伪造有效的动作。即使是服务器端检查,在某种程度上也可以被视为“混淆”。
  • 没错,你最终必须信任某些东西,但你可以尝试放弃不可能的分数。归根结底,通常很容易区分真假分数,因此即使手动修剪它们也可以。
【解决方案3】:

按优先顺序:

  1. 将玩家移动或统计数据发送到服务器。防止奇怪的行为。 例如:得分过高、无效动作、无法重播的动作等
  2. 防止客户端出现异常行为。与上面相同,但不在服务器上。例如:生活突然改变、移动速度过快等
  3. 创建混淆的 JS 输出(无论如何您都应该这样做以减小 JS 大小)例如:GWT(Java 到 JS 编译器)、Google Closure Compiler(ADVANCED_OPTIMIZATIONS 会混淆更多,--output-wrapper (function(){%output %})() 包裹在闭包中),Yahoo Compressor
  4. 混淆变量值,例如:编码字符串(xor、替换、BASE64),不要使用正常的变量增量
  5. 使用闭包来封装变量名:(function(){code here})()

编辑:我想明确指出,正如 Rich Bradshaw 所说,最好的解决方案仍然是将计算转移到服务器上。这些东西只能做这么多,即使你混淆了代码。

这是一个也适用于您的 Javascript 游戏的链接,我认为这可能是您问题的最佳答案:What is the best way to stop people hacking the PHP-based highscore table of a Flash game

从该链接获得的最重要的想法是:

我们的目标不是阻止这一切 攻击;是为了让攻击更 比真的要贵 擅长游戏并击败它。

【讨论】:

  • 你能解释一下你的意思是“不要使用正常的变量增量”吗? score += 100; 的替代品是什么?
  • 注意:作弊者仍然可以追踪影响显示分数的函数,并挂钩正确的函数调用以人为地增加分数。无论如何,这里有一个与布拉德所说的非常相似的想法:将显示的分数和“有效”分数分开。让“有效”分数附加一个整数哈希。并计算归因于得分的动作。您可以减少而不是增加计数以使其更加混乱。您还可以使用花哨的数学来存储值。和/或什至将分数与其他重要值进行异或。
  • 您也可以使用类型转换到不同的基础。 parseInt(x,radix) Number.toString(radix)。这会使随意的记忆搜索变得困难(即使在幼儿中也很常见,至少我在计算机上看到过)。但这不会阻止他们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多