阻止客户端调用JavaScript函数

时间:2015-07-17 14:31:32

标签: javascript

想象一下,你有一个简单的JavaScript函数:

printf

您可以将脚本文件包含在HTML文件中 调用该函数。问题是JavaScript是客户端等等 例如,每个人都可以使用谷歌浏览器地址输入或firefox控制台调用此功能。

我该如何防止这种情况?如果你实现一个游戏或用户可以在记分员列表中的东西,例如,很容易操纵这个记分员。

3 个答案:

答案 0 :(得分:7)

  

我该如何防止这种情况?

你不能。

您做客户端的一切都必须被视为不安全。永远不要假设检查或有效的东西,因为它通过了一些客户端检查。您应该始终对客户端的每个检查使用服务器端验证。总是!

  

如果您实施游戏或其他用户可以在记分员列表中的东西,例如,很容易操纵此记分员列表。

是的,在那个客户端上。那么你为什么关心?分数应该在服务器端计算,因此更改UI客户端并不会有任何帮助。

让Jon Skeet害怕!

yes

答案 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

你可以做的一些事情:

  1. 检查客户端对服务器更改的反应时间,检查反应过快。

  2. 存储游戏内部状态服务器端并检查服务器上客户端发送的输入。

  3. 您还可以混淆Javascript。 How can I obfuscate (protect) JavaScript?

  4. 你也必须走暗黑3道路。

    • 买支票 - 如果我买东西,我应该有足够的黄金
    • 出售支票 - 如果我在卖东西,我需要在我的库存中有这个项目
    • 伤害检查 - 如果我正在攻击某些东西(敌人),我的攻击力不会超过我的武器可以造成的最大伤害(在这里你不应该指望客户告诉他使用了哪种武器,因为它应该是坚持早些时候) ......等等。