0

我知道没有办法向用户隐藏加载到 HTML 页面中的 JS,但是对于我安排的接下来的几个项目(游戏),这确实造成了很大的问题 - 没有什么可以阻止勇敢的用户简单地打开安慰自己,比如说,再给自己二十条生命/在他们的分数上增加一百万。

代码混淆会使这变得更加困难,但并非不可能,而且让需要保护的东西在服务器/PHP 上运行似乎根本不切实际——无论如何,检索到的任何数据都可能再次被覆盖。类似地,可以使用闭包隐藏变量,但构造函数仍然可见,因此可以重写。

(我意识到在浏览器游戏中发生这种情况的可能性很低,但我认为这个问题值得讨论,因为数据安全/隐藏比游戏更进一步)

我不能使用 Flash,因为它们需要在移动设备上工作(出于同样的原因,applet OOQ),而且我确实需要将 JS 用于一个游戏的引擎,因为大量运行时代码是动态生成的/改变。

有没有人在 JS/HTML 游戏中向最终用户隐藏程序逻辑的实用或巧妙的解决方案?

4

3 回答 3

2

对此没有真正的解决方案,您只能真正阻止或减慢用户的速度 - 而不是阻止他们。

我过去选择做的是这样的:

(function(){
    var Game = {
        // game object stuff.
    }
    // Game listeners
    window.addEventListener("load", function() {
        Game.init();
    });
})();

函数包装器从全局命名空间中隐藏了 Game 变量(因此在 JavaScript 控制台中,继续进行修改并不那么简单)。希望这可以帮助!

于 2013-04-02T00:07:59.123 回答
1

服务器端验证是确保客户端完整性的唯一方法。

对不起 :(

于 2013-04-02T00:10:12.830 回答
1

在这里,乔的想法是正确的。

您的解决方案是在闭包内运行所有内容。

没有的Game.player.num_lives;东西。

var Game = (function () {

    var game = {},

        import = function (module_name, module_constructor) {
        },

        public_interface = {
            import : import,
            load   : load,
            start  : start
        };

    return public_interface;
}());

/* player.js */
Game.import("player", function () { /* ... */ });

现在除了 running.start();之外,游戏之外应该没有任何交互。

这使得事情在结构方面变得更加复杂,并确保每个注入的对象都可以访问它需要的其他部分(最少)。

如果我们谈论的是单人游戏,那么现在篡改变得非常非常困难。
就多人游戏而言,这对于保护您的服务器免受客户端-服务器通信完全没有任何作用。通过手工制作发布到服务器的帖子来破解排行榜或“自动触发”等需要通过在服务器上运行游戏来处理,并且仅接受和验证客户端输入(并告诉客户端接下来会发生什么回复)。

于 2013-04-02T00:28:25.367 回答