【问题标题】:Detecting when a user executes JavaScript in the browser检测用户何时在浏览器中执行 JavaScript
【发布时间】:2019-03-29 19:10:10
【问题描述】:

我目前正在开发一款完全基于浏览器的游戏(例如Cookie Clicker),并且我正在努力将用户利用可见 JavaScript 欺骗他们的游戏存档的可能性降到最低。为了便于解释,我们来看一个假设函数;

let user = {
    money: 0
};

function addMoney(amount) {
    user.money += amount;
}

如果这在我的游戏中是一个真正的功能,那么任何用户都可以简单地打开开发者控制台,输入addMoney(1e100),然后立即破坏我潜在玩家群之间竞争的可能性。

我想知道是否有任何方法可以禁用外部 JavaScript 输入(无论是通过开发者控制台还是通过在地址栏中使用 javascript:() 注入),如果不存在这样的事情,是至少有可能检测外部 JavaScript,而不是由网站本身在内部执行的 JavaScript?

【问题讨论】:

  • 总是希望用户更改您的 js,并为服务器编写代码以防止这种情况发生。
  • 我认为不可能完全按照您的要求进行操作,但是如果您将逻辑基于用户输入(例如“点击”事件),您可以在事件处理程序中编写匿名函数和检查事件的isTrusted 值。
  • 如果游戏完全基于浏览器,你最好的选择可能是混淆,使用window,并确保你的代码在一个模块中,所以没有什么是全局的。如果你有服务器,处理所有重要的游戏逻辑,这样他们就不会作弊
  • 让我看看我是否明白。您的游戏不与服务器交互?你将如何保存你的球员的进步?你会相信前端所说的吗?如果是这种情况,是什么阻止用户使用邮递员或 curl 请求将任何数据保存在您的服务器中。如果您没有将用户的数据保存在服务器中,您如何比较他们的高分?用户会为自己作弊吗?
  • 将它全部包装在一个闭包中,从内部订阅 dom 方法以从外部访问。这样,用户就不能直接调用您的方法。但是,仍然可以设置断点并以这种方式深入研究范围,但我怀疑隐藏全局 ref 会大大减少作弊。您还可以使用 WebWorkers 来“隐藏”全局变量,并对传入消息进行某种校验和/身份验证/完整性检查。基本上,JS 的安全模型是引用库,所以你必须删除引用。您无法阻止用户 JS,甚至不必费心尝试。其他选项是全部在服务器端完成。

标签: javascript browser console developer-console


【解决方案1】:

不要再说了:

如果“作弊者”有足够的决心(和熟练),您不会阻止他们,但混淆/缩小代码会使其变得更加困难并阻止绝大多数人——当然是临时的。有很多可用的工具可以做到这一点,而且很容易做到..

这个很好用:
https://developers.google.com/closure/compiler/

【讨论】:

    【解决方案2】:

    除了这里提到的混淆选项之外,还有一些 JavaScript 安全工具,例如 Jscrambler,可以在检测到任何篡改尝试时破坏代码。他们有an example,与您描述的相同。

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 2012-10-18
      • 1970-01-01
      • 2016-06-24
      • 2018-03-24
      • 2013-07-29
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多