我想制作一个JavaScript应用程序,但不想把代码开源,因此我希望学习如何混淆我的JS代码?这是可能的吗?
我想制作一个JavaScript应用程序,但不想把代码开源,因此我希望学习如何混淆我的JS代码?这是可能的吗?
混淆:
尝试使用YUI Compressor。这是一个非常流行的工具,由Yahoo UI团队构建、增强和维护。
您还可以使用:
更新:此问题最初是在2008年提出的,上述技术已过时。您可以使用:
私有字符串数据:
保持字符串值私有是另一个问题,混淆不会带来太多好处。当然,通过将源代码打包成杂乱无章的缩小版,你可以通过混淆达到轻量级的安全性。大多数情况下,查看源代码的是用户,客户端上的字符串值是为他们使用而设计的,因此那种私有字符串值并不经常需要。
如果您确实有一个值,您永远不希望用户看到,您将有几个选项。首先,您可以进行某种加密,在页面加载时进行解密。那可能是最安全的选择之一,但也是很多工作,可能是不必要的。您可以对一些字符串值进行base64编码,那会更容易..但是真正想获取这些字符串值的人可以轻松解码它们。加密是真正防止任何人访问您的数据的唯一方法,而大多数人发现这比他们所需的安全性更高。
附注:
Javascript中的混淆已知会引起一些bug。虽然混淆器变得更好了,但许多公司认为他们从缩小体积和gzip压缩中获得了足够的好处,而混淆带来的额外节省并不总是值得麻烦的。如果您想保护您的源代码,也许您会决定这值得您的时间和精力,只是为了使您的代码难以阅读。JSMin是一个很好的选择。
--preserve-semi
。将私有变量重写为a,b,c等通常是安全的。我还会让压缩器在代码中的每个分号后面加一个换行符 --line-break 0
。这样,在生产环境中,如果出现错误,我至少可以有一个有效的参考线索,并且可以在开发副本中找到该代码。否则,您只会在一大堆代码行上遇到错误,而不知道错误在哪里。 - zuallauz我很惊讶没有人提到谷歌的Closure Compiler。它不仅可以进行代码缩小/压缩,还会分析以找到和删除未使用的代码,并进行最大限度的代码缩小的重新编写。它还可以进行类型检查并警告语法错误。
JQuery最近从YUI Compresser转向Closure Compiler,并看到了“显著的改进”。
混淆代码永远不会真正起到作用。对于任何真正想要获得你的代码的人来说,这只是一个速度障碍。更糟糕的是,它阻止了用户修复漏洞(并将修复发送回给您),使您在现场诊断问题更加困难。这是浪费你时间和金钱。
与律师讨论知识产权法以及您的法律选项。 “开源” 不意味着“人们可以阅读源代码”。相反,开放源代码是一种特定的许可模型,允许自由使用和修改您的代码。如果您不授予此类许可,则复制您的代码的人会违反法律,并且(在大多数国家)您有法律选择阻止他们。
您真正保护代码的唯一方法是不发布它。将重要的代码移到服务器端,并让公共Javascript代码执行Ajax调用。
有许多免费的JavaScript混淆工具可用,但需要注意的是很难将JavaScript混淆到无法被反向工程。
为此,我使用过几种选项:
YUI Compressor。雅虎的JavaScript压缩程序可以很好地压缩代码以提高其加载时间。它有一定程度的混淆效果。基本上,压缩器会更改函数名、删除空格并修改本地变量。这是我最常用的工具。这是一个开源的基于Java的工具。
JSMin是由Douglas Crockford编写的一个工具,旨在压缩JavaScript源代码。用Crockford的话来说,“JSMin不混淆,但确实使代码难看。”它的主要目标是缩小源代码的大小,以便在浏览器中更快加载。
Free JavaScript Obfuscator。这是一个基于Web的工具,尝试通过对其进行编码来混淆您的代码。我认为其编码(或混淆)形式的权衡可能会以文件大小为代价,但这是个人喜好的问题。
[ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]
变量替换成至少 [var1, var2,..]
。我可以在两分钟内轻松地去除丑陋的代码,重新缩进和搜索/替换变量名。并且,我并不比普通初级开发人员聪明。简单的事实是,没有办法隐藏客户端JS。你最多只能买到5分钟的时间,但那毫无用处。这些东西只是为了向不懂编码的人推销“安全性”。任何写过JS代码的人都不会相信这种垃圾。 - Peter R我会做什么:
A. 围攻黑客!
这将会是我虚假/混淆的秘密JavaScript代码启动器的第二部分,就像您在源代码中看到的那样。
这段代码是干什么的?
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. 对代码进行一些混淆处理
那是什么?
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C 创建一个难以显示的php文件,其中包含真正的代码
这个php代码是用来做什么的?
如果一切正常,它将显示正确的代码,否则将显示虚假代码或禁止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
SECRET JavaScript = document.body.appendChild(document.createElement('div')).innerText='Awesome';
FAKE = window.open('', '_self', '');window.close();
那么...如果你在SECRET JavaScript中定义事件处理程序,它可能是可访问的...你需要在launchcode之外定义它们,并将其指向嵌套的SECRET函数。
因此...有没有一种简单的方法获取代码?
document.body.appendChild(document.createElement('div')).innerText='Awesome';
我不确定这是否有效,但我正在使用Chrome并检查“元素”、“资源”、“网络”、“源代码”、“时间轴”、“配置文件”和“审计”,但我没有找到上述行。
注意1:如果您从Chrome的“检查元素”->“网络”中打开Troll.php网址,则会得到虚假代码。
注意2:整个代码都是为现代浏览器编写的。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>
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=';}; ?>
试用JScrambler。最近我试用了一下,对它印象深刻。 它提供了一系列模板用于混淆,针对那些不太关心细节只想快速完成任务的用户,还提供了预定义设置。此外,您还可以通过选择所需的转换/技术来创建自定义混淆。
解释型语言的问题在于,您需要发送源代码才能使它们工作(除非您有一个将其编译为字节码的编译器,但是反编译相当容易)。
因此,如果您不想牺牲性能,您只能对变量和函数名称进行操作,例如将它们替换为a、b...aa、ab...或a101、a102等。当然,还要尽可能地删除空格/换行符(这就是所谓的JS压缩程序所做的)。
混淆字符串会影响性能,如果您需要实时加密和解密它们。此外,JS调试器可以显示最终值...
与大多数其他答案不同,我建议不要使用YUI Compressor;你应该使用Google Closure。
这并不是因为它可以压缩更多,而是因为它可以捕获JavaScript错误,例如a = [1,2,3,];
,这会导致IE出现问题。
我可以推荐Patrick J. O'Neil的JavaScript Utility(链接)。它可以混淆/压缩并且在这方面似乎相当不错。话说,我从未尝试过将其集成到任何构建脚本中。
至于混淆和缩小 - 我不是很喜欢前者。它使得调试变得不可能(错误在第一行...“等等,只有一行”),并且总是需要时间来解包。但是如果你需要的话...好吧。