是否可以在运行时或运行后操纵每个Javascript变量、对象?

是否可以在运行时或运行后操纵每个Javascript变量、对象?,javascript,Javascript,似乎没有办法完全隐藏源代码/加密内容以防止用户检查脚本背后的逻辑 那么,除了查看源代码之外,是否可以在脚本运行时操纵每个变量、对象? 在某种程度上,这似乎是可能的:通过使用Chrome的开发工具或Firebug,您可以轻松地编辑变量,甚至在全局范围内调用函数。 那么变量、实例化对象内部的函数或自调用匿名函数呢?以下是一个例子: var varInGlobal = 'On the global scope: easily editable'; function CustomConstructor

似乎没有办法完全隐藏源代码/加密内容以防止用户检查脚本背后的逻辑

那么,除了查看源代码之外,是否可以在脚本运行时操纵每个变量、对象? 在某种程度上,这似乎是可能的:通过使用Chrome的开发工具或Firebug,您可以轻松地编辑变量,甚至在全局范围内调用函数。 那么变量、实例化对象内部的函数或自调用匿名函数呢?以下是一个例子:

var varInGlobal = 'On the global scope: easily editable';

function CustomConstructor()
{
    this.exposedProperty = 'Once instantiated, can be easily manipulated too.';

    this.func1 = function(){return func1InConstructor();}

    var var1InConstructor = 'Can be retrived by invoking func1 from an instantiated object';
                            // Can it be assigned a new value after this is instantiated?

    function func1InConstructor()
    {
        return var1InConstructor;
    }
}

var customObject = new CustomConstructor();
在浏览器上运行此操作后:

// CONSOLE WINDOW
varInGlobal = 'A piece of cake!';

customObject.exposedProperty = 'Has new value now!';
customObject.var1InConstructor; // undefined: the variable can't be access this way
customObject.func1(); // This is the correct way
在此阶段,用户是否可以在customObject中编辑变量“var1InConstructor”

下面是另一个例子:

有一个基于Javascript的RPG游戏。游戏中的英雄有两个属性:力量和敏捷。角色的最终伤害是通过结合这两个属性来计算的。很明显,玩家可以通过检查源代码来发现这一逻辑


让我们假设整个脚本是自调用的,并且stats/calculate函数位于对象的构造函数中,因此在实例化之后无法正常访问它们。我的问题是,玩家是否可以在游戏运行时编辑角色的str和agi(通过使用Firebug或其他方法),这样他们就可以滚动所有内容并破坏游戏?

是的,如果您使用来自客户端的数据更新服务器端状态,则客户端上运行的任何内容都应该不受信任。

是的,如果您使用来自客户端的数据更新服务器端状态,则客户端上运行的任何内容都应不受信任。

正如您所建议的,您不能隐藏逻辑/客户端代码。您可以通过混淆源代码使人们阅读源代码变得“困难”,但撤销它非常简单


假设您正在根据示例制作游戏,网络游戏的第一条规则是“永远不要相信客户”。您需要在服务器上运行所有游戏逻辑,或者需要在服务器上验证所有输入。未经验证,切勿根据客户端输入更新游戏状态。

正如您所建议的,您不能隐藏逻辑/客户端代码。您可以通过混淆源代码使人们阅读源代码变得“困难”,但撤销它非常简单


假设您正在根据示例制作游戏,网络游戏的第一条规则是“永远不要相信客户”。您需要在服务器上运行所有游戏逻辑,或者需要在服务器上验证所有输入。在未首先验证的情况下,切勿基于客户端的输入更新游戏状态。

变量
var1InConstructor
不能在正常ECMAScript规则下重新绑定,因为它仅在词法范围内可见。然而,正如alex(和其他人)正确地说的那样,客户不应该被信任

以下是用户可以利用变量为只读的假设的一些方法:

  • 使用JavaScript调试器(例如FireBug)并在适用范围内的断点处停止时重新分配变量

  • 复制并粘贴原始源代码,但添加具有变量访问权限的setter。用户甚至可以复制整个程序,使几乎所有关于执行的假设失效

  • 在使用站点修改或注入值:在不实际更新原始变量(例如,
    player.power=function(){return“godlike”}
    )的情况下,可能会进行攻击

  • 最后,使用客户端程序,如果没有一个集中的权限(读:服务器)审核每个操作,就无法绝对防止用户作弊——即使这样,也可能通过读取其他游戏状态(如敌方位置)来作弊


    JavaScript易于读取、编辑和动态执行,比编译后的应用程序更容易破解/篡改。模糊处理是可能的,但如果有人想作弊,他们会这样做。

    变量
    var1InConstructor
    不能在正常的ECMAScript规则下重新绑定,因为它仅在词法范围内可见。然而,正如alex(和其他人)正确地说的那样,客户不应该被信任

    以下是用户可以利用变量为只读的假设的一些方法:

  • 使用JavaScript调试器(例如FireBug)并在适用范围内的断点处停止时重新分配变量

  • 复制并粘贴原始源代码,但添加具有变量访问权限的setter。用户甚至可以复制整个程序,使几乎所有关于执行的假设失效

  • 在使用站点修改或注入值:在不实际更新原始变量(例如,
    player.power=function(){return“godlike”}
    )的情况下,可能会进行攻击

  • 最后,使用客户端程序,如果没有一个集中的权限(读:服务器)审核每个操作,就无法绝对防止用户作弊——即使这样,也可能通过读取其他游戏状态(如敌方位置)来作弊


    JavaScript易于读取、编辑和动态执行,比编译后的应用程序更容易破解/篡改。混淆是可能的,但如果有人想作弊,他们会的。

    你不能隐藏任何变量。
    此外,如果用户精通javascript,他可以轻松编辑脚本,而无需通过控制台编辑变量值

    不能隐藏任何变量。
    此外,如果用户精通javascript,他可以轻松编辑脚本,而无需通过控制台编辑变量值

    我不认为这构成了一个答案,它可以被视为轶事,但评论有点长

    在这个问题上,当涉及到编码的完整性时,你所做的一切都必须围绕着需要验证数据没有在游戏逻辑之外发生变化

    <