我知道没有办法将JS加载到用户的HTML页面中,但对于我排队的下几个项目(游戏),这确实会产生很大的问题 - 没有什么可以阻止一个勇敢的用户只需打开控制台,比如给自己另外20个生命/增加一百万的分数。
代码混淆会使这变得更难,但并非不可能,并且在服务器/ PHP上需要保护运行的东西看起来并不实际 - 在任何情况下,任何检索到的数据都可能被重写。类似地,可以使用闭包来隐藏变量,但构造函数仍然是可见的,因此是可写的。
(我意识到在浏览器游戏中发生这种情况的可能性很低,但我认为这个问题值得讨论,因为数据安全/隐藏比游戏更进一步)
我不能使用Flash,因为他们需要在移动设备上工作(出于同样的原因,applet OOQ),理想情况下我需要将JS用于一个游戏的引擎,因为大块的运行时代码是动态生成/改变。
有没有人有一个实用或巧妙的解决方案来隐藏JS / HTML游戏中最终用户的程序逻辑?
答案 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();
之外,游戏外部不应该有任何互动。
这使得事情在结构方面变得更加复杂,并确保每个注入的对象都可以访问其所需的其他部分(最小)。
如果我们谈论单人游戏,那么篡改现在要难得多了 就多人游戏而言,这对于保护您的服务器免受客户端 - 服务器通信毫无作用。通过手工制作发布到服务器的帖子来攻击排行榜或“自动触发”等需要通过在服务器上运行游戏来处理,并且仅仅接受并验证客户端输入(并告诉客户端接下来发生什么)响应)。