混淆面向对象的javascript

时间:2014-03-04 21:01:31

标签: oop javascript-events javascript

有大量的javascript混淆网站可以解决这个问题,但是我不确定在使用OOP创建代码时该怎么做。

顺便说一句,我正在混淆以减小尺寸和可读性。我完全知道它根本不会严重保护任何东西。

例如:

<script>
    $(document).ready(function() {  
    myFunction.init(); // init

    });

</script> 

file.js

var myFunction = function () {

    return {

        //main function to initiate the module
        init: function () {
          alert('whole bunch of other stuff in here');
        }
    }
}

如果我对file.js进行模糊处理,则myFunction.init()项将丢失给程序,因为它已被重命名为某种变量。

此外,一个额外的问题是,如果从不同的类或函数调用init中的函数,由于名称的变化,它仍然会丢失。

有什么想法吗?最佳做法?

2 个答案:

答案 0 :(得分:0)

您要做的事情是众所周知的export。一些混淆器将包含一个doc-block标签,你可以添加它来保护这样的名字。

也许,这个问题会有所帮助:What is the best way to export library method, when using Closure Compiler?

否则,您需要查看正在使用的优化器,以查看它们是否支持类似功能。如果没有,您将需要寻找不同的优化器。

答案 1 :(得分:0)

我刚刚编写了自己的面向对象的Javascript代码混淆器,我的结论是很难为任何人编写一个通用的,这可能解释了缺少公开可用的工具。为了让我的工作,我必须确保我的业务代码遵守一致的编码实践。如果您认真对待代码混淆,并且不愿意编写&#34;编译器质量&#34;混淆器(我在Perl写过我的并且从未使用过lex),这是我的建议:

  1. 以递增方式对代码进行模糊处理,以便在每个步骤之后代码仍然有效。这里的想法是有很多东西可以重命名,如果你一次重命名它们,如果你的混淆破坏了代码,那么很难排除故障。在我的例子中,第一步是识别对象名称和成员函数名称而不进行任何混淆。我使用了一个配置文件,其中包含了我想要混淆的所有文件的列表,我还可以指定明确不应混淆的特定对象名称和成员函数名称。例如,如果您将函数push()命名为,则可能不希望对该函数名进行模糊处理,因为混淆器会冒混乱数组调用push()的风险。另一个例子,如果您的客户端代码按名称实例化特定对象,那么您应该选择不混淆该对象的名称。 step1的输出是所有已识别的对象名称,函数名称以及每个对象的建议混淆名称的列表。
  2. 在我的版本中,步骤2然后读入一个配置文件中定义的所有文件,使用模糊映射,并输出单个Javascript文件。由于我们有3个相关的独立项目,我们实际上有3个配置文件和3个输出文件。原始源代码由几十个文件组成,因此这对我们来说非常不同。
  3. 我们的混淆项目的下一个阶段是使用类似于步骤1和2的过程重命名成员变量。
  4. 最后阶段是运行合法的minify程序,例如closure-compiler.jar。这会产生混淆所有局部变量并删除不需要的空格的效果。
  5. 最终结果是一个几乎难以理解的文件。我们使用一个脚本将它们全部批量化,因此混淆是自动化的,无痛苦的。我们还有一个替代脚本,它可以将文件打包相同,但如果我们需要解决问题,则不需要进行模糊处理。

    以下是一些额外的建议: 1.确保您声明的每个对象都以大写字母开头,并且您声明的每个全局函数都不以大写字母开头。这样就可以区分对象和普通函数。 2.使用一致的前缀命名每个成员变量。在我的例子中,我用字母&#34; m&#34;开始所有成员变量。接着是大写字母。例如,使用this.mName而不是this.name。如果您与此实践一致,则可以使用非常简单的脚本安全地重命名成员变量的使用。

    对不起,我们不是开源我们的面向对象的Javascript混淆器。我们没有足够的时间为它提供任何支持,所以我们不会公开发布它,但我已经从组织的角度给了你我们所做的事情的本质,所以我希望它有所帮助。