防止在控制台中编辑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")
}
基本上就是标题所说的。我正在制作游戏,其中大部分是在 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")
}