在我之前的问题中: 确保 javascript 游戏时间安全
...很明显,Javascript/Canvas 游戏中的客户端计时根本不安全。我知道关于不信任客户的咒语 - 这首先是导致我挣扎的原因。
所以,如果我确实将所有计时移至服务器并进行处理,这是一个后续问题。游戏显然需要在提交之前完成。由于游戏谜题全部是 Javascript,这就引入了操纵客户端代码来伪造游戏完成的问题。
我在单独的类文件中创建了游戏 JS 代码。如果我这样实例化游戏:
var game;
$document.ready(function(){
game = new Game();
});
...然后,我可以通过控制台访问“游戏”对象及其所有方法和变量。
但是,如果我这样做:
$document.ready(function(){
var game = new Game();
});
...然后我无法通过控制台访问“游戏”对象。这似乎有所帮助,但是有什么我不知道的吗——这个对象是否仍然可以以某种我不知道的方式访问,或者让它成为该函数中的私有变量更安全一些?
注意:在这样的系统中还有许多其他的安全考虑和攻击向量。这个答案只是试图回答这里提出的具体问题。
这取决于浏览器及其开发工具提供的内容。大多数浏览器的开发工具提供以下功能:
随时暂停执行 JavaScript 并使用调试器界面。
const
,甚至可以将变量重新分配给一个新的用户创建的对象实例。导航 JS 文件并在其中设置断点。
检查 HTML 元素上的事件侦听器并在其上设置断点。
甚至还有记录JS堆内存的工具。要筛选的数据很多,但它基本上是 JS 堆上的 everything(只读)。
鉴于这些浏览器功能(以及用户可以使用他们想要的任何浏览器的事实),不可能在客户端 100% 地“保护”任何东西。这是一场失败的战斗。如果你想像游戏一样玩,你可以尽力而为。
Object.freeze
和朋友们。
不要太在意控制台。是的,如果有全局对象的方法可以很容易地被触发以“赢得”游戏,那么作弊的可能性很大,但正如您所展示的那样,它很容易被阻止。
因此,黑客只会监听(查看网络窗格)向您的服务器发出哪些请求并手动触发它们。如果它们只是一些像
/action=start
和/action=end
这样的简单url,他可以很容易地手动触发它们而无需任何时间。所以你需要防止这种情况发生(尽管你永远无法真正让它安全),例如通过添加额外的凭证令牌。或者你可以在游戏代码中嵌入一些“秘密”,这些秘密在游戏过程中会被揭示,并且需要发送到服务器以证明其合法性。当然,它们可以从您的代码中读出,但您必须让它对黑客而言太复杂。这有点像默默无闻的安全…