代码之家  ›  专栏  ›  技术社区  ›  Teifion

如何模糊(保护)javascript?[关闭]

  •  679
  • Teifion  · 技术社区  · 16 年前

    我想制作一个不是开源的JavaScript应用程序,因此我想学习如何模糊我的JS代码?这有可能吗?

    24 回复  |  直到 8 年前
        1
  •  393
  •   Mike    8 年前

    混淆:

    尝试 YUI Compressor . 它是一个非常流行的工具,由雅虎用户界面团队构建、增强和维护。

    您还可以使用:

    专用字符串数据:

    保持字符串值私有化是另一个问题,模糊化并不会真正有什么好处。当然,把你的信息源打包成一堆乱七八糟的小东西,你就有了一个轻版本的 安全 通过 默默无闻 . 大多数情况下,查看源代码的是您的用户,而客户机上的字符串值是供他们使用的,因此这种类型的私有字符串值通常不是必需的。

    如果你真的有了一个你从来都不想让用户看到的价值,你会有几个选择。首先,您可以进行某种加密,在页面加载时对其进行解密。这可能是最安全的选择之一,但也有很多工作是不必要的。您可能可以对一些字符串值进行base64编码,这会更容易。但真正想要这些字符串值的人可以 很容易解码 . 加密是真正阻止任何人访问您的数据的唯一方法,大多数人发现这比他们需要的更安全。

    司扥噢特:

    众所周知,在javascript中混淆会导致一些错误。模糊者对此有所改善,但许多机构认为他们从中看到了足够的好处。 缩小 格子平 以及增加的模糊节省 不总是值得麻烦的 .如果你试图保护你的源代码,也许你会认为这是值得的,只是为了让你的代码更难阅读。 JSMin 是个不错的选择。

        2
  •  130
  •   Jason Hall    14 年前

    我很惊讶没人提到谷歌的 Closure Compiler . 它不仅缩小/压缩,它还分析以查找和删除未使用的代码,并重写以实现最大的缩小。它还可以进行类型检查,并对语法错误发出警告。

    jquery最近从yui compresser切换到closure compiler,并看到 solid improvement

        3
  •  115
  •   Community paulsm4    7 年前

    模糊永远不会真正起作用。对于任何真正想了解你的代码的人来说,这只是一个减速带。更糟糕的是,它使您的用户无法修复错误(并将修复结果发送回您),使您更难在现场诊断问题。这是浪费你的时间和金钱。

    与律师谈谈知识产权法以及你的法律选择。 "Open Source" 并不意味着“人们可以阅读资料来源”。相反,开源是一种特殊的许可模式,它授予自由使用和修改代码的权限。如果您不授予这样的许可证,那么复制您的代码的人就违反了法律,而且(在大多数情况下)您有合法的选择来阻止他们。

    唯一能真正保护你的代码的方法就是不发布它。移动服务器端的重要代码,让您的公共JavaScript代码对其进行Ajax调用。

    See my full answer about obfuscators here.

        4
  •  50
  •   El Ronnoco    13 年前

    您可以根据自己的需要对javascript源代码进行模糊处理,但是它总是可以反向工程,这仅仅是因为需要所有源代码在客户机上实际运行…我能想到的最好的选择是使用服务器端代码完成所有的处理,而JavaScript所做的所有客户端代码都是向服务器本身发送处理请求。否则,任何人都将始终能够跟踪代码正在执行的所有操作。

    有人提到base64是为了保证字符串的安全。这是个糟糕的主意。base64可以立即被想要对代码进行反向工程的人识别出来。他们要做的第一件事就是把它解锁,看看它是什么。

        5
  •  44
  •   Tom    16 年前

    有许多JavaScript模糊工具是免费提供的;但是,我认为重要的是要注意,很难模糊到无法逆向工程的程度。

    为此,我在一定程度上使用了几个加班选项:

    • YUI Compressor . 雅虎!S JavaScript压缩器可以很好地压缩代码,从而缩短加载时间。有一个小的模糊程度,工作相对良好。实质上,压缩器将更改函数名、删除空白并修改局部变量。这是我最常使用的。这是一个开源的基于Java的工具。

    • JSMin 是道格拉斯·克罗克福德(DouglasCrockford)编写的一个工具,旨在缩小您的javascript源代码。用Crockford自己的话来说,“jsmin不会混淆,但会变丑。”它的主要目标是缩小源代码的大小,以便在浏览器中更快地加载。

    • Free JavaScript Obfuscator . 这是一个基于Web的工具,它试图通过实际编码使代码变得模糊。我认为它的编码形式(或模糊)的权衡可能以文件大小为代价;然而,这是个人偏好的问题。

        6
  •  22
  •   cocco    11 年前

    我会怎么做:

    a. 玩黑客游戏!

    这将在第二部分我的伪/模糊的秘密javascript代码启动器。 在源代码中看到的那个。

    这个代码是什么?

    1. 加载真正的代码
    2. 设置自定义标题
    3. 发布自定义变量

    var ajax=function(a,b,d,c,e,f){
     e=new FormData();
     for(f in d){e.append(f,d[f]);};
     c=new XMLHttpRequest();
     c.open('POST',a);
     c.setRequestHeader("Troll1","lol");
     c.onload=b;
     c.send(e);
    };
    window.onload=function(){
     ajax('Troll.php',function(){
      (new Function(atob(this.response)))()
     },{'Troll2':'lol'});
    }
    

    B. 稍微混淆代码

    那是什么?

    1. 这与base64中的上述代码相同
    2. 这不是秘密的javascript代码

    (new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
    

    C 创建一个很难显示的包含真正代码的PHP文件

    这个PHP代码是什么?

    1. 检查是否有正确的引用(域/dir/code of your launcher)
    2. 检查自定义标题
    3. 检查自定义post变量

    如果一切正常,它将向您显示正确的代码,否则将显示假代码或禁止IP,关闭页面。无论什么。

    <?php
    $t1=apache_request_headers();
    if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
     echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
    }else{
     echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
    };
    ?>
    

    base64引用= http://here.is/my/launcher.html

    秘密javascript= document.body.appendChild(document.createElement('div')).innerText='Awesome';

    冒牌= window.open('', '_self', '');window.close();

    现在。。如果您在秘密的javascript中定义事件处理程序,它可能是可访问的。您需要使用启动代码在外部定义它们,并指向嵌套的秘密函数。

    所以…有没有一个简单的方法来获取代码? document.body.appendChild(document.createElement('div')).innerText='awome';

    我不确定这是否可行,但我正在使用chrome并检查元素、资源、网络、源、时间线、配置文件、审计,但我没有找到上面的行。

    注意1:如果您在chrome中打开inspect element->network中的troll.php url,就会得到假代码。

    注2:整个代码是为现代浏览器编写的。PolyFill需要更多的代码。

    编辑

    洗衣店

    <!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>
    

    PHP

    <?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
    
        7
  •  18
  •   Chad Hedgcock    8 年前

    尝试 JScrambler . 我最近给它一个旋转,它给我留下了深刻的印象。 它为那些不太关心细节,只想快速完成的人提供了一组模板,这些模板带有预先定义的设置。您还可以通过选择所需的任何转换/技术来创建自定义模糊。

        8
  •  17
  •   PhiLho    16 年前

    解释语言的问题是,您发送源代码来让它们工作(除非您有一个编译器来进行字节码编译,但同样地,反编译是非常简单的)。

    因此,如果不想牺牲性能,只能对变量和函数名执行操作,例如,用a、b替换它们…AA、AB…或者A101、A102等,当然,尽可能多地删除空间/新行(这就是所谓的JS压缩器所做的)。
    如果必须对字符串进行加密和实时解密,模糊字符串会影响性能。另外,JS调试器可以显示最终值…

        9
  •  17
  •   jball    14 年前

    与我建议反对Yui压缩机的大多数其他答案相反;您应该使用 Google Closure .

    不是因为它压缩得更多,而是因为它会捕获javascript错误,比如 a = [1,2,3,]; 这使我陷入困境。

        10
  •  13
  •   dbr    16 年前

    一个非开源的基于javascript的应用程序是相当愚蠢的。javascript是一种客户端解释语言。模糊并不能起到很好的保护作用。

    JS模糊通常是为了减少脚本的大小,而不是“保护”它。如果您不希望代码公开,则javascript不是正确的语言。

    周围有很多工具,但大多数都有“压缩器”(或“微型化器”)这个词,这是有原因的。

        11
  •  11
  •   Gustavo Rodrigues    11 年前

    你不能保护客户端代码:只需在Google Chrome上按F12, 暂停JavaScript执行 你会得到所有的字符串,甚至那些加密的。 Beautify 资讯科技与 rename variables 你会得到几乎原始的代码。

    如果您正在编写服务器端的javascript(即nodejs),则担心有人入侵您的服务器,并希望使黑客工作更困难,从而给您更多的时间重新访问,然后使用 JavaScript编译器 :

    在高级编译中需要使用闭包编译器,因为它是重命名所有变量的唯一工具,即使这些变量在多个文件/模块中使用。但它只是有一个问题:只有当你写在 coding style .

        12
  •  11
  •   ʍǝɥʇɐɯ    10 年前

    我可以推荐 JavaScript Utility 帕特里克·J·奥尼尔。它可以混淆/压缩和压缩,而且看起来非常擅长这些。也就是说,我从未尝试将它集成到任何类型的构建脚本中。

    至于模糊与缩小,我不太喜欢前者。它使调试无法进行(第1行出错…”等等,只有一行”),它们总是需要时间解包。但如果你需要…好。

        13
  •  5
  •   Dynamite Blitzer    13 年前

    我建议首先使用类似于yui compressor的工具缩小,然后使用类似的工具将所有字符串和数字转换为十六进制值。 http://www.javascriptobfuscator.com/

    有了这一点,代码将变得几乎不可能理解,我认为在这个阶段,黑客重新制定代码要比从头开始重新编写要花更多的时间。重写和克隆实际上是无法停止的。毕竟我们是自由人!

        14
  •  5
  •   smdrager    12 年前

    DeanEdward的packer是一个非常好的模糊器,尽管它主要是模糊代码,而不是代码中的任何字符串元素。

    见: Online Javascript Compression Tool 从下拉列表中选择Packer(Dean Edwards)

        15
  •  4
  •   Shadow Wizard    13 年前

    我一直在使用 Jasob 多年来,它是最容易混淆的东西。
    它有一个高级的用户界面,但仍然是直观的,易于使用。
    它还将处理HTML和CSS文件。

    最好的使用方法是在 私有的 带有类似下划线的变量,然后使用 sort 将它们组合在一起的功能 检查 它们被当作模糊的目标。

    用户仍然可以查看您的源代码,但是当您的私有变量从类似的类型转换为 _sUserPreferredNickName a .

    引擎将自动统计目标变量的数量,并对其进行优先级排序,以获得最大的压缩。

    我不为Jasob工作,我也没有从提升他们中得到什么,只是提供一些友好的建议。
    缺点是它不是免费的,而且有点贵,但是与其他选择相比,它仍然值得——免费的选择甚至不会接近。

        16
  •  4
  •   niutech    12 年前

    你试过了吗? Bananascript ?它产生高度压缩和完全不可读的代码。

        17
  •  4
  •   shaILU    12 年前

    我使用关闭编译器实用程序来进行Java脚本混淆。它缩小了代码,并有更多的模糊选项。 此实用程序可在以下网址的谷歌代码中找到:
    Closure Tools

    但现在有一天我听到了很多关于乌格利夫的话。您可以在闭包编译器和uglifyjs之间找到各种比较,其中uglify似乎是赢家。
    UglifyJS: A Fast New JavaScript Compressor For Node.js That’s On Par With Closure

    很快我就会给你机会。

        18
  •  3
  •   xgMz    16 年前

    我觉得有些企业(例如:jackbe)把加密的javascript代码放在*.gif文件中,而不是JS文件中,作为一种额外的模糊度量。

        19
  •  3
  •   Adrian    14 年前

    作为一个javascript/html/css模糊器/压缩器,你也可以尝试 Patu Digua .

        20
  •  3
  •   Jerczu    13 年前

    试试这个工具 Javascript Obfuscator

    我在我的HTML5游戏中使用了它,不仅把它的大小从950kb减少到了150,而且使源代码无法读取,关闭编译器和微型处理器是可逆的,我个人不知道如何逆转这种混乱。

        21
  •  3
  •   Mike    12 年前

    你一定要考虑看看 Obfuscriptor .

    我超越了我们从其他工具如 YUI Compressor Google Closure .

    模糊的代码看起来更像是加密的。不像我以前看到的。

        22
  •  3
  •   Chris S    11 年前

    This one minifies 但不会混淆。如果不想使用命令行Java,可以将JavaScript粘贴到Web窗体中。

        23
  •  2
  •   Stephen Chung    12 年前

    如果使用JavaScript库,请考虑Dojo工具包,它与闭包编译器的高级模式编译兼容(经过细微修改)。

    Dojo – The Only JavaScript Library Compatible with The Closure Compiler

    用闭包高级模式编译的代码几乎不可能进行逆向工程,甚至通过一个美化程序,就像 整个的 代码库(包括库)是模糊的。平均也只有25%。

    Javascript代码只是缩小了(yui压缩器、uglify等),通过美化后很容易进行逆向工程。

        24
  •  2
  •   Henry    12 年前

    我以前用过这个,它做得很好。这不是免费的,但你一定要看看。
    JavaScript Obfuscator & Encoder