【问题标题】:Prevent user from changing game values in the browser console阻止用户在浏览器控制台中更改游戏值
【发布时间】:2014-01-02 15:35:27
【问题描述】:

任何玩家都可以通过浏览器控制台更改纸杯蛋糕的数量来轻松地在此游戏中作弊。我想知道是否有办法阻止用户这样做。这也发布在github

var numberOfCupcakesDisplay = document.getElementById("numberOfCupcakes");
var cupcake = document.getElementById("cupcake");

function updateValues() {
    numberOfCupcakesDisplay.innerHTML = amountOfCupcakes.toString();
    //displays number of cupcakes to screen
    document.getElementById("amountOfToasters").innerHTML = amountOfToasters.toString();
    //displays number of toasters to screen
    document.getElementById("toasterButton").innerHTML = "&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp" + Math.round(costOfToasters).toString() + " cc";
    //changes cost of toaster every time it is bought by 110%
}

cupcake.addEventListener('webkitAnimationEnd', function(e){
    e.preventDefault();
    this.style.webkitAnimationName = '';
}, false);

function clickCupcake() {
    ++amountOfCupcakes;
    cupcake.style.animation = "shiftCupcake";
    cupcake.style.webkitAnimationName = "shiftCupcake";
}

updateValues();

【问题讨论】:

  • 任何您尝试设置的保护措施,人们都可以撤消。这是不可能的。
  • JS 是客户端。这是不可能改变的。
  • 创建一个局部变量来保存要保护的值,并且从不直接使用用户提供的值来更改其值。当然,如果您将分数发送到服务器,那么事情会更加困难(因为 HTTP 请求很容易被伪造)。如果您能提供更多信息,我们可以为您提供更好的帮助。
  • 你可以想办法让它更尴尬,但是,是的,我们都可以看到。

标签: javascript html console console.log


【解决方案1】:

是的!正如其他答案所提到的,防止用户从浏览器控制台更改值是 IMPOSSIBLE 。换句话说,您只是在问如何编写 JS 代码以使用户无法调试它。您总是可以使用一些让想要在游戏中作弊的人难以忍受的方法。

1.混淆代码。

查看这些链接以获取有关混淆的更多信息。

2.不要将游戏的控制值存储在全局变量中。

不要将控制值存储在全局变量中。而是定义一个类并将这些变量作为私有变量,这样用户必须深入挖掘才能找出断点的放置位置。

3.Minify/压缩你的 javascripts。

混淆或多或少也包括缩小。

【讨论】:

    【解决方案2】:

    你无法阻止这一点。你能做的最好的就是缩小 JS,这样玩家就很难找到正确的值来改变。事实上,你无法通过任何游戏或应用程序来阻止这种情况。用户的计算机控制着所有的信息,因此他们可以做任何他们想做的事情。

    避免这种情况的唯一方法是在您控制的服务器上进行所有处理。即使如此,玩家也可以对他们的输入数据撒谎(因此是瞄准机器人或其他黑客行为)。

    【讨论】:

      【解决方案3】:

      通过浏览器控制台更改纸杯蛋糕的数量

      好吧,从技术上讲,您可以通过创建新范围来防止这种情况:

      (function(){
          var cupcakes = 10;
      })();
      
      console.log(cupcakes); // ReferenceError: cupcakes is not defined
      

      但请注意,即使有这种保护(即编辑 JS 源代码),仍然存在“作弊”的方法。如果您将结果发送到服务器...好吧,如果不是不可能的话,这将更加困难,因为您可以轻松地通过XMLHttpRequest 发送一个简单的 HTTP 请求。

      【讨论】:

        【解决方案4】:

        实际上可能有一种方法可以实现您的目标。但这取决于游戏的逻辑。

        如果您可以在服务器上模拟游戏,您可以为蛋糕生成随机 ID,并且当游戏(在客户端)创建新蛋糕时,它会为其请求一个 ID。稍后当蛋糕被“销毁”时,它会联系服务器并提供蛋糕的 ID。然后在服务器上根据收到的 ID 计算最终分数。

        这样您就可以跟踪用户的实际操作。

        但是攻击者可以监听网络请求并确定创建新 ID 的请求。同样的方式他可以确定请求告诉服务器这个ID已经被“销毁”了。

        如果你的游戏逻辑允许,你可以例如告诉服务器每 5 秒左右只生成一个 ID。您还可以将所有蛋糕都“销毁”且没有遗漏的所有结果标记为欺骗(如果游戏足够难的话)。

        因此,它仍然不是 100% 安全的,但您可能能够达到相对较高水平的欺骗保护。另一方面,它增加了很多代码复杂性,你必须权衡利弊。

        【讨论】:

          猜你喜欢
          • 2014-04-16
          • 1970-01-01
          • 1970-01-01
          • 2022-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-05
          • 1970-01-01
          相关资源
          最近更新 更多