【问题标题】:Prevent js editing in console防止在控制台中编辑js
【发布时间】:2019-01-21 05:18:59
【问题描述】:

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

有什么方法可以隐藏某些对象/变量在浏览器控制台中不可编辑?

【问题讨论】:

  • 请分享您的具体用例以及您为解决此问题所做的努力,也许发布您尝试过的代码。
  • 在浏览器中运行的Javascript本质上是开放的,每个人都可以看到通过开发者工具改变/影响。如果您不希望这样,请不要在浏览器中使用 Javascript。
  • @PeterB 但我也很想知道这是否可能。因为当我打开 Facebook,然后打开控制台 Facebook 会在控制台中发布一个大红色警报。我想知道他们是如何做到这一点的。 :)
  • 要显示这样的文本,请参见此处:How do I create formatted javascript console log messages

标签: javascript game-development


【解决方案1】:

用 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")
}

【讨论】:

    【解决方案2】:

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

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

    var player = {hitpoints: 100};
    
    // game logic here
    

    你会这样做:

    (function() {
      var player = {hitpoints: 100};
    
      // game logic here
    })();
    

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


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

    【讨论】:

    • 函数周围的圆括号是使其匿名,还是在任何函数内声明变量的行为使这些变量匿名?
    • 缺少名称使函数匿名。它周围的括号只是为了让它在后面跟着() 时正确解析(我不确定如何以不同的方式解析它,但 JS 语法可能很奇怪。)
    【解决方案3】:

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

    我只是在网上搜索“混淆 javascript 代码”,我发现这个链接有一个很好的混淆前后的例子 - here

    【讨论】:

      【解决方案4】:

      您可以缩小/丑化您的代码,让别人更难修改它,但最重要的部分是在服务器端验证所有内容。如果他们的生命值前一秒等于 10,下一秒等于 10000,显然某些事情会很可疑,并且服务器可能会阻止自己将其广播给其他玩家 - 基本上将那些不太好的玩家隔离到他们自己的 PC 上。

      【讨论】:

        【解决方案5】:

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

        【讨论】: