1

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

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

我见过一些,但它们要么是像 Java 这样的独立程序,要么是你需要付费的东西,我不能使用它。

有谁知道可能能够做到这一点的类或代码片段?

如果 YUI Compressor 真的可以做到这一点,任何人都可以指出我如何将它实现到 php 中的一些帮助吗?

4

2 回答 2

2

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

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

如果你仍然想走重命名路线,我的回答是:

我还没有花时间谷歌什么是 YUI 压缩器,但是你所描述的听起来你需要解析任何 javascript,然后从那里开始重命名函数和变量。我看到几个问题

  • 如果/当您的 javascript 使用内置变量名称,如documentorwindow和类似的内置函数,如.getElementById(). 那些你不能触摸或脚本不能做它应该做的事情。
  • Javascript 在浏览器的上下文中执行,并且可能使用来自其他 javascript 文件的函数/变量,例如 HTML 等

    <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都适当地更新为您的新名称。

  • 根据您想要重命名的频率,您可以在更容易破解代码与完全破坏浏览器缓存之间进行权衡

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

总的来说,这看起来不像是一个你想要承担的 1 人(甚至 2 或 3 人)项目(除非你手上有很多时间,但事情会发生变化),可能会有这样的事情已经在那里或附近的东西,你可以分叉并修改你的需要。从本质上讲,我认为您想要做的工作比它的价值还多。

于 2012-06-23T16:46:20.260 回答
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)" ; ?>

等等

于 2012-06-23T16:03:31.057 回答