由于最近的浏览器增强功能,使用canvas和javascript开发游戏已成为一个不错的选择,但现在代码很容易访问,只需编写
javascript:score=99999
或
javascript:lives=99
会破坏游戏目标。
我知道通过一些服务器端检查可以做一些事情,但我更愿意访问服务器只是为了存储玩家统计数据,或者甚至在大多数情况下只有客户端。
我想知道至少是否有一些最佳实践开始。
(使用不那么明显的变量名称是一个开始,但还不够)
- 增加 -
感谢您的回复,我希望改进客户端代码,足以阻止“随意黑客”,但仍然保持代码尽可能干净。 任何真正想破解它的人都会成功,即使是在服务器端检查,正如我在许多Flash游戏中看到的那样。
答案 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 compressor或packer之类的工具压缩和混淆您的脚本。
答案 2 :(得分:2)
按优先顺序排列:
编辑:我想明确表示,最好的解决方案仍然是将计算结果移到服务器上,正如Rich Bradshaw所说。即使在对代码进行模糊处理之后,这些事情也只能做很多事情。
这是一个也适用于您的Javascript游戏的链接,我认为可能是您问题的最佳答案:What is the best way to stop people hacking the PHP-based highscore table of a Flash game
从该链接获取的最重要的想法是:
目标不是阻止这一点 攻击;这是为了使攻击更多 比真的更贵 擅长游戏并击败它。