防止在控制台中编辑js

Prevent js editing in console

基本上就是标题所说的。我正在制作游戏,其中大部分是在 js 中。我担心的是玩家统计数据都只是其 object 中的变量,它们很容易在浏览器控制台中更改(例如 player.hitpoints = 1000;)。

有什么方法可以隐藏某些 objects/variables 在浏览器控制台中不可编辑吗?

JavaScript 是客户端脚本语言,这意味着它是 客户端 计算机上的解释器,他可以做或改变他想做的任何事情。您可以对代码进行丑化和最小化以混淆代码,但这不会阻止用户更改它。

我只是 google "obfuscation javascript code online" 我发现这个 link 是混淆过程前后的一个很好的例子 - here

您可以使用 JWT 制作不经常更改的不可变数据。对于您的情况,我建议将状态存储在服务器上。

您可以 minify/uglify 您的代码使其更难被他人修改,但最重要的部分是验证服务器端的所有内容。如果他们的生命值前一秒等于 10,下一秒等于 10000,显然有些事情是可疑的,服务器可以防止自己将其广播给其他玩家——本质上是将不合格的玩家隔离到他们自己的 PC 上。

其他答案已经解释了混淆和客户端的固有限制JavaScript。它们是正确且相关的,但没有直接解决问题。

要使其无法通过浏览器控制台访问变量¹,您需要将其设为函数内的局部变量。例如,而不是:

var player = {hitpoints: 100};

// game logic here

你会做:

(function() {
  var player = {hitpoints: 100};

  // game logic here
})();

这样就创建了一个匿名函数,然后马上调用它,所谓IIFE。现在 player 不再是全局的(即 window 对象上的 属性),而是仅存在于此函数中。


¹ 它仍然可以通过调试器来完成,但它比仅仅复制和粘贴一些命令要困难得多。

用 let 和 const 声明的标识符确实具有块作用域。因此,如果您的变量未使用 var 声明,则使用块语句。

示例: 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")
}