如何混淆(保护)JavaScript?

Tei*_*ion 704 javascript obfuscation source-code-protection

我想创建一个非开源的JavaScript应用程序,因此我希望学习如何模糊我的JS代码?这可能吗?

kep*_*aro 402

混淆:

试试YUI Compressor.它是一个非常受欢迎的工具,由Yahoo UI团队构建,增强和维护.

您也可以使用:

私人字符串数据:

将字符串值保密是一个不同的问题,混淆不会带来太大的好处.当然,通过将您的源代码打包成乱码,缩小的混乱,您可以通过默默无闻来获得轻松的安全性.大多数情况下,您的用户正在查看源,并且客户端上的字符串值是供其使用的,因此通常不需要这种私有字符串值.

如果您确实拥有一个您从未希望用户看到的值,那么您将拥有几个选项.首先,您可以进行某种加密,在页面加载时解密.这可能是最安全的选择之一,但也可能是许多不必要的工作.您可能可以对某些字符串值进行base64编码,这会更容易..但是真正想要这些字符串值的人可以轻松解码它们.加密是真正阻止任何人访问您的数据的唯一方法,并且大多数人发现它比他们需要的更安全.

边注:

众所周知,Javascript中的混淆会导致一些错误.混淆器正在变得更好一些,但许多服装决定他们从缩小gzipping中看到足够的好处,并且混淆的额外节省并不总是值得的.如果您正在尝试保护自己的源代码,也许您会认为这是值得的,只是为了让您的代码更难阅读.JSMin是一个很好的选择.

  • 我想补充说,执行base64编码对安全性没有任何好处,因为它是一个简单的可逆过程.如果它是解密的客户端,即使加密也无济于事.确保字符串安全性的唯一方法是让客户端只看到加密的字符串,然后传递给它 (32认同)
  • 服务器进一步处理. (16认同)
  • 仅供参考,在线YUI压缩机可在此处找到:http://refresh-sf.com/yui/ (9认同)
  • 当我使用YUI Compressor进行缩小时,我确保它使用"安全"的缩小方法,即它保留了分号`--preserve-semi`.将私有变量重写为a,b,c等通常是安全的.我做的另一件事是让minifier在代码`--line-break 0`中的每个分号后面换行.然后在生产中如果它出错我至少有一个有效的参考线来工作,并且可以在我的开发副本中找到该代码.否则,您最终会在大量代码上出错,并且不知道错误在哪里. (9认同)
  • 如果必须由浏览器解密以使用它们,那么加密字符串值只会比base64编码它们稍微好一些.原因是你必须给浏览器加密密钥,浏览器也可以为用户做任何事情. (7认同)

Jas*_*all 136

我很惊讶没人提到Google的Closure Compiler.它不只是缩小/压缩,它分析以查找和删除未使用的代码,并重写以实现最大限度的缩小.它也可以进行类型检查,并会警告语法错误.

JQuery最近从YUI Compresser切换到Closure Compiler,看到了" 坚实的改进 "

  • 是的,但最近他们离开了Closure编译器,现在正在使用UglifyJS.使用闭包编译器压缩后,JQuery代码出错了 (60认同)

Sch*_*ern 117

混淆永远不会真正起作用.对于任何真正想要获取代码的人来说,这只是一个减速带.更糟糕的是,它可以防止用户修复错误(并将修复程序发回给您),并使您更难以诊断现场问题.浪费你的时间和金钱.

与律师讨论知识产权法以及您的法律选择."开源"并不意味着"人们可以阅读来源".相反,Open Source是一种特定的许可模式,允许自由使用和修改代码.如果您没有授予此类许可,那么复制您的代码的人将被违反,并且(在世界上大多数地方)您有合法的选择来阻止它们.

您可以真正保护代码的唯一方法是不发货.移动重要的代码服务器端并让您的公共Javascript代码对它进行Ajax调用.

请在此处查看关于混淆器的完整答案.

  • 律师可能比丢失的代码创造更多的成本/问题,仔细考虑并安排大量资金聘请律师! (15认同)
  • 律师+1,但这可能不适用于其他国家/司法管辖区. (13认同)
  • @Alerty 1)许可证从根本上讲是*授予*使用受版权保护的材料.没有许可证,您几乎没有权利使用它.您无需签名即可获得权利.许可证与合同不同.2a)由于问题是关于人们在未经许可的情况下复制和使用HTML/Javascript,许可证不是"被埋没"的,它就在那里被采取的东西.2b)没有许可证,您没有权利使用其他人的受版权保护的材料.3)律师不需要理解Javascript,只需要了解知识产权法. (12认同)
  • -1:我相信寻找一位了解JavaScript的律师会很难......更不用说找到"违规者"所需的费用和时间.如果他从未签署任何内容,是否有人真的违反了隐藏在HTML/JavaScript文件中的许可证?AJAX调用+1. (11认同)
  • @Alerty不要迟钝.这是关于惩罚那些未经许可复制文件以供在自己网站上使用的人.你所说的是合同,而不是许可证.合同需要相互同意并且是给予和接受.许可证授予您使用知识产权的权利.许可证是一种方式(所有者授予您的权利),您不需要签名,因为您没有提供任何东西.许多"软件许可协议"实际上都是合同,因为它们不仅仅是对财产进行许可,而且还涉及有时起诉的荒谬的事情. (4认同)
  • 门锁永远不会真正起作用.对于任何真正想要进入您房产的人来说,这只是一个减速带.更糟糕的是,它可以防止你的朋友解决你家中的问题,并使你更难以诊断现场的问题.浪费你的时间和金钱. (3认同)
  • 免费在线混淆器 vs 复杂昂贵的律师......我不知道我会选择哪个 (2认同)
  • 投票赞成说"聘请律师".多么令人讨厌的声明.您不能对在WWW上运行的Javascript进行版权保护.这与版权自定义CSS类的逻辑相同.祝好运. (2认同)
  • @NiCkNewman 虽然版权法因国家/地区而异,但在大多数国家/地区,您(或您授予版权的公司)对您编写的代码(包括 HTML、Javascript 和 CSS)拥有版权。在许多国家/地区,您自动拥有作品的版权。把它放在网上并不会改变这一点。如果您在出版领域(如果您是程序员,您也是)并且不了解版权和许可、您对作品的权利以及权利,您可能想与律师交谈或做一些研究别人的。 (2认同)
  • @user626528 世界上任何人都可以尝试打破这些门锁。他们可以多次尝试打破它们。您无法知道是否有人试图撬开您的锁。如果他们闯入你永远不会知道。高质量的自动选择(反编译器/反混淆器)是免费提供的。这些是物理安全和网络安全之间的本质区别。 (2认同)

Cla*_*diu 48

您可以随心所欲地混淆javascript源代码,但只需要将所有源代码实际运行在客户端计算机上就可以反向工作...我能想到的最佳选择是完成所有处理使用服务器端代码,javascript所做的所有客户端代码都是将处理请求发送到服务器本身.否则,任何人都将始终能够跟踪代码正在执行的所有操作.

有人提到base64来保持字符串安全.这是一个糟糕的主意.Base64可以立即被想要对代码进行反向工程的人员识别.他们要做的第一件事就是取消编码,看看它是什么.

  • 无论我走到哪里,最常见的答案是"如何模糊我的Javascript?" 是"你不应该担心这一点,因为有人可能会混淆它." 这不是一个真正的答案. (43认同)
  • @Travis:我没有说"你不应该担心它." 我只是说,如果你想要一个闭源程序,你不会想要在客户端javascript中编写它,因为你所做的任何混淆都不会阻止它(非常容易)进行逆向工程. (8认同)
  • 对.这绝不会回答"我怎样才能混淆我的JavaScript".混淆不是一个抽象概念,它是一个技术概念.操作简单地问"如何?" (8认同)
  • @Vivek:有点晚了,但我真正的意思是"服务器端代码".可以在浏览器中运行javascript,只在服务器上运行,但我不知道它有多常见. (2认同)
  • @Madbreaks:问题是在不使他的代码开源的背景下.直接的技术答案是被接受的答案,但更好的上下文答案(例如,你真正想做的是什么?),IMO,你不能拥有非开源的客户端javascript,因为无论你如何混淆它,每个人都有源头.无论哪种方式,这两个答案都在这里,人们可以阅读并从中受益. (2认同)

Tom*_*Tom 45

有许多JavaScript混淆工具可以免费获得; 但是,我认为重要的是要注意,很难将JavaScript混淆到无法进行逆向工程的程度.

为此,我在某种程度上加速了以下几种选择:

  • YUI压缩机.雅虎的JavaScript压缩器可以很好地缩短代码,从而缩短加载时间.有一小部分混淆效果相对较好.实质上,Compressor将更改函数名称,删除空格并修改局部变量.这是我经常使用的.这是一个基于Java的开源工具.

  • JSMin是Douglas Crockford编写的一个工具,旨在缩小您的JavaScript源代码.用克罗克福德自己的话来说,"JSMin并没有混淆,但它确实是丑化的." 它的主要目标是缩小源的大小,以便在浏览器中加快加载速度.

  • 免费JavaScript混淆器.这是一个基于Web的工具,它试图通过对代码进行实际编码来模糊代码.我认为其编码(或混淆)形式的权衡可能以文件大小为代价; 然而,这是个人偏好的问题.

  • 这是关于统计数据.什么是有人通过混淆和没有访问您的代码的门槛是什么?他们仍然可以访问,但门槛越高,人越少.人们对某事的了解越少,事情就越安全.标准安全分类实践. (20认同)
  • 由于Javascript代码必须在客户端的机器上运行,因此不仅难以模糊到代码无法进行逆向工程而且*不可能*的程度. (19认同)
  • @PeterR _“我可以在两分钟内从字面上取消拼写,重新缩进以及搜索/替换var名称” _-当然,继续尝试在经过最小化处理,经过混淆的20MB代码库捆绑结构上进行尝试即使使用原始的经过注释的原始代码,也需要花费数周的时间来理解。更难的是,存在混淆工具,如果缩进,行等发生更改,故意使您的代码损坏。 (3认同)

coc*_*cco 23

我会做什么:

A. Troll黑客!

这将是我的假/混淆秘密javascript代码LAUNCHER的第二部分.您在源代码中看到的那个.

这段代码是什么?

  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'});
}
Run Code Online (Sandbox Code Playgroud)

B.稍微混淆代码

那是什么?

  1. 这与base64中的代码相同
  2. 这不是SECRET的javascript代码

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
Run Code Online (Sandbox Code Playgroud)

C使用里面的真实代码创建一个难以显示的php文件

这个php代码是什么?

  1. 检查正确的引荐来源(您的启动器的域/目录/代码)
  2. 检查自定义HEADER
  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=';
};
?>
Run Code Online (Sandbox Code Playgroud)

base64 referrer = http://here.is/my/launcher.html

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

假的= window.open('', '_self', '');window.close();

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

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

我不确定这是否有效,但我正在使用chrome并检查元素,资源,网络,来源,时间轴,配置文件,审核但我没有找到上面的行.

注意1:如果你打开来自Inspect element-> network in chrome的Troll.php网址你会得到假代码.

note2:整个代码是为现代浏览器编写的.polyfill需要更多代码.

编辑

launcher.html

<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>
Run Code Online (Sandbox Code Playgroud)

Troll.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=';}; ?>
Run Code Online (Sandbox Code Playgroud)

  • 即使这很有趣,能够正确检查网站的Web开发人员也能以某种方式获取源代码.我真的认为在你把它放到网上的那一刻就没有办法隐藏任何类型的数据. (5认同)
  • 哦,是的,我还会混淆 javascript 代码。 (2认同)

小智 18

试试JScrambler.我最近给了它一个旋转,并对它印象深刻.它提供了一组用于混淆的模板,具有预定义的设置,适用于那些不关心细节并希望快速完成任务的人.您还可以通过选择所需的任何转换/技术来创建自定义混淆.

  • JScrambler订阅非常昂贵...最便宜的订阅需要至少3个月的价格145美元 - 这是疯了. (7认同)
  • 免费计划仅包括优化和缩小. (2认同)
  • 今天看看JScrambler的网站和更多的定价计划我看不到免费选项.只有免费试用.. (2认同)

Phi*_*Lho 17

解释语言的问题在于你发送源代码以使它们工作(除非你有一个编译器来进行字节码编码,但是再次,反编译是非常简单的).

因此,如果您不想牺牲性能,则只能对变量和函数名称进行操作,例如.用a,b ... aa,ab ...或a101,a102等替换它们.当然,尽可能多地移除空间/换行符(这就是所谓的JS压缩器所做的).
如果你必须对它们进行加密并实时解密,那么混淆字符串会受到性能影响.另外一个JS调试器可以显示最终值......


Tho*_*ini 17

与大多数其他答案相反,我建议反对YUI Compressor; 你应该使用Google Closure.

并不多,因为它压缩更多,但主要是因为它会捕获javascript错误,如a = [1,2,3,];使IE变得混乱.

  • 不应该检查你的代码是否有错误,并且在*混淆之前以任何方式进行不兼容?实际上与混淆无关 (5认同)

dbr*_*dbr 13

一个非开源的基于Javascript的应用程序是相当愚蠢的.Javascript是一种客户端解释语言.混淆不是很多保护..

JS混淆通常是为了减少脚本的大小,而不是"保护"它.如果您处于不希望公开代码的情况,Javascript就不是正确的语言.

周围有很多工具,但大多数都在其名称中使用"压缩器"(或"缩小器")这个词是有原因的.


Tsv*_*nev 11

我可以推荐Patrick J. O'Neil的JavaScript Utility.它可以混淆/压缩和压缩,它们似乎相当不错.也就是说,我从未尝试将其集成到任何类型的构建脚本中.

至于混淆与缩小 - 我不是前者的忠实粉丝.它使调试变得不可能(第1行的错误......"等待,只有一行")并且它们总是需要时间来解压缩.但如果你需要......好吧.


Gus*_*ues 11

您无法保护客户端代码:只需在Google Chrome上按F12,暂停执行javascript即可获得所有字符串,即使是加密的字符串.美化并重命名变量,你几乎可以获得原始代码.

如果你正在编写服务器端javascript(即NodeJS)害怕有人入侵你的服务器并想让黑客工作更加困难,给你更多时间来获取你的访问权限,那么使用javacript编译器:

您需要在高级编译中使用Closure Compiler,因为它是重命名所有变量的唯一工具,即使这些变量在多个文件/模块中使用.但它只是有一个问题:它只有在你编写它的编码风格时才有效.


小智 5

我建议先使用YUI Compressor之类的东西进行缩小,然后使用类似http://www.javascriptobfuscator.com/的内容将所有字符串和数字转换为HEX值.

有了这个,代码几乎无法理解,我认为在这个阶段,黑客需要更多的时间重新编写你的代码,而不是从头开始重新编写代码.重写和克隆是你实际上无法阻止的.毕竟我们是自由人!


smd*_*ger 5

Dean Edward的Packer是一个优秀的混淆器,虽然它主要模糊代码,而不是代码中可能包含的任何字符串元素.

请参阅:在线Javascript压缩工具, 然后从下拉列表中选择Packer(Dean Edwards)


小智 5

试试这个工具Javascript Obfuscator

我在我的 HTML5 游戏中使用了它,不仅将其大小从 950KB 减小到了 150KB,而且还使源代码变得不可读。闭包编译器和压缩器是可逆的,我个人不知道如何扭转这种混淆。