使用PHP重命名JavaScript变量和函数

时间:2012-06-23 15:55:29

标签: php javascript class function variables

我已经搜索过并发现了另一个非常接近的问题,但结果是YUI Compressor,我没有发现它有用。

我使用php来模糊我的JavaScript代码,但这还不够。我需要一个我可以运行的PHP脚本,然后在混淆之前将所有函数和变量重命名为随机名称(仅限字母)和之前。

我见过一些,但他们要么像Java这样的独立程序,要么需要付出代价,我不能用它。

是否有人知道可能能够执行此操作的类或代码段?

如果YUI Compressor实际上可以做到这一点,有人能指出我如何将其实现到php中的一些帮助吗?

2 个答案:

答案 0 :(得分:2)

写完这篇冗长的回复后,我开始想知道为什么你需要首先混淆javascript代码? Javascript代码本质上是公开的,任何查看您页面的人都可以看到结果。如果你有秘密/专有的东西你需要做的事情,看看像AJAX或其他方式回调你的服务器进行处理,并让它吐出javascript的结果。您在javascript中执行的任何处理都将被任何人看到。混淆只会使调试变得更难,并且不能保证人们不会破解代码。

通常使用javascript来控制演示文稿,将服务器调用的结果解析为文档,并验证用户输入。你想做的任何秘密,都要在服务器端进行,否则他们无法看到正在发生的确切代码。

如果您仍然想要重命名路线,那么我的回答是我的回答:

我没有花时间去研究YUI压缩器的时间,但是你所描述的内容听起来像你需要解析任何javascript,并从那里开始重命名函数和变量。我看到了一些问题

  • 如果/当您的javascript使用内置变量名称(如documentwindow)和类似内置函数(如.getElementById())时。那些你无法触摸或脚本无法完成它的目的。
  • Javascripts在浏览器的上下文中执行,并且可能使用来自HTML之类的其他javascript文件中的函数/变量,如

    <script type="text/javascript" src="a.js"></script>
    <script type="text/javascript" src="b.js"></script>
    
    由于b.js之后包含a.jsb.js可以引用并使用a.js中的任何函数或变量,因此如果您对名称进行加扰,则必须确保进行任何引用b.js中的a.js会更新为您的新名称。

  • 根据您希望进行此重命名的频率,您可以轻松地修复代码,而不是完全删除浏览器缓存

    • 修改名称一次并保留结果 - 然后浏览器会正确缓存响应,并且您的网站应该运行良好,但由于名称在调用之间是一致的,因此对某人来说更容易破解重命名。虽然对于这个解决方案,您不一定需要PHP,只需要任何语言或脚本并运行一次
    • 修改名称每个会话 - 可能是最佳解决方案和中间路线虽然它会要求您保留与每个会话相关的额外内存,因为名称更改因此对新java脚本的任何请求来自同一会话的文件将被重命名(大多数现代浏览器和服务器设置将允许缓存相同的命名javascript文件,如第2点所述,如果{{1}}中的任何函数/变量被另一个javascript文件使用它们必须相应更新
    • 修改javascript文件每个请求 - 这可能要求您禁用javascript文件的缓存,因为每个页面请求都需要下载新的javascript文件,即使用户重新加载该文件也是如此页。这将大大降低页面加载性能(您必须重新命名所有函数并生成新的javascript文件,然后由浏览器下载并由其解析)并且还会增加带宽消耗,但是页面不会有两个脚本一样的。

总的来说,这似乎不是一个你想要进行的1人(甚至2或3人)项目(除非你手上有很多时间,但事情会发生变化),可能会有这样的东西已经存在,或者你可以分离出来并根据你的需要进行修改。从本质上讲,我认为你想做的事情将是更多的工作,而不是它的价值。

答案 1 :(得分:1)

我不确定你为什么要这样做,但手动做起来似乎很容易。

您所需要的只是编写一个生成随机字符串的函数,并在您的PHP中为您拥有的所有JavaScript函数定义变量,并为其分配随机字符串。然后在打印出实际JavaScript方法的代码时替换它们。唯一需要注意的是你需要仔细检查你的随机字符串是不是重复。如果您不能使用数字(根据您的问题),那么使用字母并将它们递增到附加在随机字符串的后面。所以在伪代码中......

    $var1 = generateRandomString(); //custom method to create random string and append unique letter at end to guarantee no duplicates. 
        $function1 = generateRandomString();

        and in javascript...

   //variable assignment
   <?php echo "$var1='foo'"; ?>;

    //function definition
        function <?php echo "$function1" ; ?>( myArg ){
           alert(myArg); //this will alert 'foo'
        }

    //calling the function
    <?php echo "$function1($var1)" ; ?>