基本上是标题所说的。我正在制作一个游戏,其中大部分是用js开发的。我担心的是,玩家统计信息只是其对象中的变量,并且很容易在浏览器控制台中更改(例如player.hitpoints = 1000;)。
有什么方法可以隐藏某些对象/变量,使其无法在浏览器控制台中进行编辑?
答案 0 :(得分:2)
JavaScript是客户端脚本语言,这意味着它是客户端计算机上的解释器,他可以执行或更改所需的任何内容。您可以丑化和最小化代码以使代码模糊,但这不会阻止用户对其进行更改。
我只是在Google上搜索“在线混淆JavaScript代码”,并且发现了此链接,其中包含混淆过程前后的一个很好的例子-here
答案 1 :(得分:1)
其他答案已经解释了混淆和客户端JavaScript的固有局限性。它们是正确且相关的,但没有直接解决问题。
要使其不可能通过浏览器控制台访问变量,您需要将其设置为函数内部的局部变量。例如,代替:
var player = {hitpoints: 100};
// game logic here
您会这样做:
(function() {
var player = {hitpoints: 100};
// game logic here
})();
这将创建一个匿名函数,然后立即调用它,即所谓的IIFE。现在,player
不再是全局的(即window
对象的属性),而是仅存在于此函数中。
¹仍然可以通过调试器完成,但是比仅仅复制和粘贴一些命令要困难得多。
答案 2 :(得分:0)
您可以使用JWT生成不经常更改的不可变数据。对于您的情况,我建议将状态存储在服务器上。
答案 3 :(得分:0)
您可以缩小/缩小代码,以使某些人很难修改它,但是最重要的部分是验证服务器端的所有内容。如果他们的生命值等于每秒10秒,下一秒等于10000,则很明显有些麻烦,服务器可能会阻止自己将其广播给其他玩家-本质上将ne-er-well-well隔离到了自己的PC上。 >
答案 4 :(得分:0)
用let和const声明的标识符确实具有块作用域。因此,如果您的变量未使用var声明,请使用block语句。
示例:
code:{
//your code...
}
code: {
let hitpoint = 12;
let kill = function() {
hitpoint -= 12;
}
//function kill(){} is accessible from outside
//let kill = function(){} is not accessible from outside
console.log("From inside:", hitpoint)
}
try {
console.log("From outside:", hitpoint)
} catch (err) {
console.log("From outside:", "It gives an error. So you can't access it from the console or anywhere outside the code")
}