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

Omi*_*iod 14 javascript

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

javascript:score=99999
Run Code Online (Sandbox Code Playgroud)

要么

javascript:lives=99
Run Code Online (Sandbox Code Playgroud)

将破坏游戏目标.

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

我想知道至少是否有一些最好的实践开始.

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

-添加-

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

Ric*_*haw 11

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

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

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

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

离线游戏可能会出现在高分榜上,也可能表明他们未经过验证.

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

  • 确实,要求你最终必须信任某些东西,但你可以尝试丢弃不可能的分数.在一天结束时,通常很容易区分真假分数,所以即使手动修剪它们也行. (2认同)

Jim*_*inP 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)
Run Code Online (Sandbox Code Playgroud)

当我深入了解Les Paul Google Doodle时,我'学会了'这种技巧.

为了更安全(不完全安全,但它会惹恼一些黑客),通过YUI压缩器打包器之类的工具压缩和混淆你的脚本.

  • @eskimoblood @JiminiP @Tom我可以给你一个改变这些值的例子_without_修改代码.拉起Javascript dev控制台并在"var b = 42;"上设置断点,然后在断点发生时,在JS控制台中键入"a = b = 999999999".对于任何人来说都很轻松. (11认同)
  • 这篇文章暗示这些变量和函数永远不能从外部访问,这显然是错误的,因为代码在客户端可用,这意味着如果需要可以访问任何内容.一个人需要一个有权限的服务器来做一些安全的事情. (6认同)