在HTML页面中隐藏用户的JS /逻辑

时间:2013-04-02 00:03:15

标签: javascript obfuscation

我知道没有办法将JS加载到用户的HTML页面中,但对于我排队的下几个项目(游戏),这确实会产生很大的问题 - 没有什么可以阻止一个勇敢的用户只需打开控制台,比如给自己另外20个生命/增加一百万的分数。

代码混淆会使这变得更难,但并非不可能,并且在服务器/ PHP上需要保护运行的东西看起来并不实际 - 在任何情况下,任何检索到的数据都可能被重写。类似地,可以使用闭包来隐藏变量,但构造函数仍然是可见的,因此是可写的。

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

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

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

3 个答案:

答案 0 :(得分:2)

没有真正的解决方案,你只能真正阻止或减慢用户 - 不要阻止他们。

我过去选择的是这样的:

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

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

答案 1 :(得分:1)

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

抱歉:(

答案 2 :(得分:1)

Joe在这里有了正确的想法。

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

没有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 () { /* ... */ });

现在除了运行.start();之外,游戏外部不应该有任何互动。

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

如果我们谈论单人游戏,那么篡改现在要难得多了 就多人游戏而言,这对于保护您的服务器免受客户端 - 服务器通信毫无作用。通过手工制作发布到服务器的帖子来攻击排行榜或“自动触发”等需要通过在服务器上运行游戏来处理,并且仅仅接受并验证客户端输入(并告诉客户端接下来发生什么)响应)。