防止Javascript游戏调整/黑客攻击

时间:2011-06-12 08:41:08

标签: javascript

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

javascript:score=99999

javascript:lives=99

会破坏游戏目标。

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

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

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

- 增加 -

感谢您的回复,我希望改进客户端代码,足以阻止“随意黑客”,但仍然保持代码尽可能干净。 任何真正想破解它的人都会成功,即使是在服务器端检查,正如我在许多Flash游戏中看到的那样。

3 个答案:

答案 0 :(得分:11)

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

对于像纸牌或国际象棋这样的游戏来说很容易,但对于更复杂的游戏来说却并非如此。

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

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

离线游戏可以在高分榜上加以加注,也可以显示未验证的内容。

值得指出的是,对于任何javascript调试器,例如Webkit中的Inspector,Firefox上的Firebug或Opera上的Dragonfly,即使您的代码处于关闭状态,也很容易在客户端更改变量的值。任何形式的混淆都是毫无意义的,因为在玩游戏时,可以很容易地观察哪个变量对应于得分,并且可以简单地从代码中读取任何编码或其他任何内容。

答案 1 :(得分:9)

我会说出我在评论中所说的内容:将每个源代码放在(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之类的工具压缩和混淆您的脚本。

答案 2 :(得分:2)

按优先顺序排列:

  1. 将播放器移动或统计信息发送到服务器。防止奇怪的行为。 例如:得分过高,行动无效,无法重播的行为等
  2. 防止客户端的奇怪行为。与上面相同但不在服务器上。例如:突然的生活改变,移动太快等等。
  3. 创建混淆的JS输出(无论如何你都应该这样做)例如:GWT(Java到JS编译器),Google Closure编译器(ADVANCED_OPTIMIZATIONS会混淆更多, - output-wrapper(function(){%output %})()包装在封闭中),Yahoo Compressor
  4. 模糊变量值,例如:编码字符串(xor,替换,BASE64),不使用正常变量增量
  5. 使用闭包来封装变量名:(function(){code here})()
  6. 编辑:我想明确表示,最好的解决方案仍然是将计算结果移到服务器上,正如Rich Bradshaw所说。即使在对代码进行模糊处理之后,这些事情也只能做很多事情。

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

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

      

    目标不是阻止这一点   攻击;这是为了使攻击更多   比真的更贵   擅长游戏并击败它。