繁体   English   中英

Javascript 安全问题

[英]Javascript Security Concern

在我之前的问题中: Securing javascript game timing

... 很明显,Javascript/Canvas 游戏中的客户端计时根本不安全。 我知道不信任客户的口头禅——这首先是导致我挣扎的原因。 :-)

因此,如果我确实将所有时间转移到服务器并处理它,这是一个后续问题。 游戏显然需要在提交之前完成。 由于游戏拼图全是Javascript,这就引入了操纵客户端代码来伪造游戏完成的问题。

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

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

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

但是,如果我这样做:

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

...然后我无法通过控制台访问“游戏”object。 这似乎有帮助,但有什么我不知道的 - 这个 object 是否仍然可以以某种我不知道的方式访问,或者在 function 中使其成为私有变量更安全一些?

谢谢!

不必太在意控制台。 是的,如果某些全局对象的方法可以轻易触发以“赢得”游戏,则很可能会作弊,但正如您所演示的那样,可以很容易地防止它。

因此,黑客只会侦听(查看网络窗格)向您的服务器发出的请求,然后手动将其触发。 如果它们只是一些简单的网址,例如/action=start/action=end ,那么他可以很容易地手动触发它们而无需任何时间。 因此,您将需要防止这种情况的发生(尽管您永远无法真正确保它的安全),例如通过添加其他凭据令牌。 或者,您可以在游戏代码中嵌入一些“秘密”,这些秘密会在游戏过程中显示出来,并需要发送到服务器以证明其合法性。 当然可以从您的代码中读取它们,但是对于黑客来说 ,您必须使其变得过于复杂 有点像是默默无闻的安全 ……

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

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

  • 在任何时间点暂停执行 JavaScript 并使用调试器接口。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM