JS函数闭包中的变量可以通过任何方式访问吗(包括devtools)?怎么样?

问题描述 投票:0回答:2

在我之前的问题中: 确保 javascript 游戏时间安全

...很明显,Javascript/Canvas 游戏中的客户端计时根本不安全。我知道关于不信任客户的咒语 - 这首先是导致我挣扎的原因。

所以,如果我确实将所有计时移至服务器并进行处理,这是一个后续问题。游戏显然需要在提交之前完成。由于游戏谜题全部是 Javascript,这就引入了操纵客户端代码来伪造游戏完成的问题。

我在单独的类文件中创建了游戏 JS 代码。如果我这样实例化游戏:

var game;
$document.ready(function(){
  game = new Game();
});

...然后,我可以通过控制台访问“游戏”对象及其所有方法和变量。

但是,如果我这样做:

$document.ready(function(){
  var game = new Game();
});

...然后我无法通过控制台访问“游戏”对象。这似乎有所帮助,但是有什么我不知道的吗——这个对象是否仍然可以以某种我不知道的方式访问,或者让它成为该函数中的私有变量更安全一些?

javascript security google-chrome-devtools firefox-developer-tools
2个回答
0
投票

注意:在这样的系统中还有许多其他的安全考虑和攻击向量。这个答案只是试图回答这里提出的具体问题。

这取决于浏览器及其开发工具提供的内容。大多数浏览器的开发工具提供以下功能:

  • 随时暂停执行 JavaScript 并使用调试器界面。

    • 在调试器暂停的当前执行点范围内的变量通常可以通过 devtools 以各种方式访问。特别是,通过控制台,任何人可以在控制台中对该变量做的任何事情都是公平的游戏:查询它的字段,调用它的方法等。如果变量绑定不是
      const
      ,甚至可以将变量重新分配给一个新的用户创建的对象实例。
  • 导航 JS 文件并在其中设置断点。

    • 这是指向上述要点的向量。
    • 你可以通过使用 JS 缩小(即混淆)来降低它的吸引力,但这不会阻止有决心的人。
      • 字符串文字不会被缩小,通常可以帮助导航和理解缩小的代码。
  • 检查 HTML 元素上的事件侦听器并在其上设置断点。

    • 如果一个变量在函数闭包中有一个引用绑定到它,这个函数闭包已知是某个 HTML 元素的事件监听器,或者可以被这样的事件监听器访问(执行方面),这可以是第一个项目符号的另一个向量观点。这在网页游戏中很常见。键盘事件监听器通常是访问引用重要游戏对象的函数的入口点。
  • 甚至还有记录JS堆内存的工具。要筛选的数据很多,但它基本上是 JS 堆上的 everything(只读)。

鉴于这些浏览器功能(以及用户可以使用他们想要的任何浏览器的事实),不可能在客户端 100% 地“保护”任何东西。这是一场失败的战斗。如果你想像游戏一样玩,你可以尽力而为。

  • 调查
    Object.freeze
    和朋友们。
    • 冻结或密封任何可以冻结或密封的东西,包括类原型
  • 使变量可以是 const const
  • 使用断言在逻辑的关键部分断言程序状态是一致的,并尝试检测篡改。

-1
投票

不要太在意控制台。是的,如果有全局对象的方法可以很容易地被触发以“赢得”游戏,那么作弊的可能性很大,但正如您所展示的那样,它很容易被阻止。

因此,黑客只会监听(查看网络窗格)向您的服务器发出哪些请求并手动触发它们。如果它们只是一些像

/action=start
/action=end
这样的简单url,他可以很容易地手动触发它们而无需任何时间。所以你需要防止这种情况发生(尽管你永远无法真正让它安全),例如通过添加额外的凭证令牌。或者你可以在游戏代码中嵌入一些“秘密”,这些秘密在游戏过程中会被揭示,并且需要发送到服务器以证明其合法性。当然,它们可以从您的代码中读出,但您必须让它对黑客而言太复杂。这有点像默默无闻的安全

© www.soinside.com 2019 - 2024. All rights reserved.