想象一下,你有一个简单的JavaScript函数:
printf
您可以将脚本文件包含在HTML文件中 调用该函数。问题是JavaScript是客户端等等 例如,每个人都可以使用谷歌浏览器地址输入或firefox控制台调用此功能。
我该如何防止这种情况?如果你实现一个游戏或用户可以在记分员列表中的东西,例如,很容易操纵这个记分员。
答案 0 :(得分:7)
我该如何防止这种情况?
你不能。
您做客户端的一切都必须被视为不安全。永远不要假设检查或有效的东西,因为它通过了一些客户端检查。您应该始终对客户端的每个检查使用服务器端验证。总是!
如果您实施游戏或其他用户可以在记分员列表中的东西,例如,很容易操纵此记分员列表。
是的,在那个客户端上。那么你为什么关心?分数应该在服务器端计算,因此更改UI客户端并不会有任何帮助。
让Jon Skeet害怕!
答案 1 :(得分:2)
实际上,如果你想让事情变得安全,你需要一些服务器验证。 你在JS中所做的一切都是不安全的,并且可以被访问"由最终用户。 无论如何,如果你想拥有一些在控制台上无法使用的功能,你可以考虑使用Module Pattern并在命名空间内创建你的功能,并且只公开你想要的功能。 例如,您可以执行以下操作:
var GAME = (function(){
var private1, privatePublic;
private1 = function() {
//This won't be accessible from outside
};
privatePublic = function() {
console.log("public");
//This will be accessible from outside because i am going to return it
};
return {
getPrivatePublic: privatePublic
}
}());
GAME.getPrivatePublic(); // will log "public"
GAME.private(); // Will throw error
这样,你就是"隐藏"从控制台使用您的代码。无论如何,正如我在第一行中提到的那样,它并不安全,并且具有JS知识的用户可以访问所有内容。
答案 2 :(得分:1)
这就是您在服务器端添加后端代码以测试任何作弊者的原因。 在注入功能和模块的JavaScript游戏中没有什么能阻止它们。
任何在线多人游戏的规则#1:永远不要相信客户。
任何在线多人游戏的规则#2:永远不要相信客户。
这就是为什么大多数JavaScript游戏严重依赖服务器状态,以防止作弊。 因此,您必须在计算服务器端进行 ALL 。
你可以做的一些事情:
检查客户端对服务器更改的反应时间,检查反应过快。
存储游戏内部状态服务器端并检查服务器上客户端发送的输入。
您还可以混淆Javascript。 How can I obfuscate (protect) JavaScript?
你也必须走暗黑3道路。