问:
关闭。这个问题需要更加集中。它目前不接受答案。想改进这个问题?更新问题,使其仅通过编辑此帖子专注于一个问题。 8年前关闭。改进这个问题
我想制作一个非开源的 JavaScript 应用程序,因此我想学习如何混淆我的 JS 代码?这可能吗?
答1:
https://tlr.xinbeitime.com – 让你随时掌握ATP、WTA最新网球排名动态。
混淆:
试试 YUI Compressor。它是一个非常流行的工具,由 Yahoo UI 团队构建、增强和维护。
您还可以使用:
谷歌闭包编译器
丑化JS
UPDATE: This question was originally asked on 2008, and The mentioned technologies are deprecated. you can use:
terser - web.dev 中的更多信息。
私有字符串数据:
将字符串值保密是一个不同的问题,混淆不会有太大的好处。当然,通过将您的源代码打包成一个乱七八糟的、缩小的混乱,您可以通过默默无闻获得一个轻量级的安全性。大多数情况下,查看源代码的是您的用户,而客户端上的字符串值是供他们使用的,因此通常不需要这种私有字符串值。
如果你真的有一个你不想让用户看到的价值,你会有几个选择。首先,您可以进行某种加密,在页面加载时对其进行解密。这可能是最安全的选择之一,但也有很多可能不必要的工作。您可能可以对一些字符串值进行 base64 编码,这会更容易…但是真正想要这些字符串值的人可以轻松解码它们。加密是真正防止任何人访问您的数据的唯一方法,大多数人发现加密比他们需要的更安全。
边注:
众所周知,Javascript 中的混淆会导致一些错误。混淆器对此有所改善,但许多机构认为他们从 minifying 和 gzipping 中看到了足够的好处,而混淆的额外节省 并没有总是值得的麻烦。如果你想保护你的源代码,也许你会认为值得你花时间,只是为了让你的代码更难阅读。 JSMin 是一个不错的选择。
我想补充一点,进行 base64 编码对安全性没有好处,因为它是一个微不足道的可逆过程。如果在客户端解密,即使加密也无济于事。确保字符串安全的唯一方法是让客户端只看到加密的字符串,并将其传递给
服务器进行进一步处理。
仅供参考,可以在此处找到在线 YUI 压缩器:refresh-sf.com/yui
如果必须由浏览器解密才能使用它们,加密字符串值只会比对它们进行 base64 编码稍微多一点好处。原因是您还必须为浏览器提供加密密钥,并且浏览器可以执行的任何操作用户也可以执行。
当我使用 YUI Compressor 进行缩小时,我确保它使用“安全”的缩小方法,即保留分号 --preserve-semi。将私有变量重写为 a、b、c 等通常是安全的。我要做的另一件事是让压缩器在代码 --line-break 0 中的每个分号后放置一个换行符。然后在生产中,如果出现错误,我至少有一个有效的参考线可供使用,并且可以在我的开发副本中找到该代码。否则,您最终会在大量代码行中出现错误,并且不知道错误在哪里。
答2:
https://tennisliveranking.com,Instant updates on ATP, WTA, and ITF rankings.
我很惊讶没有人提到 Google 的 Closure Compiler。它不只是缩小/压缩,它分析以查找和删除未使用的代码,并重写以最大程度地缩小。它还可以进行类型检查并警告语法错误。
JQuery 最近从 YUI Compresser 切换到 Closure Compiler,并看到一个“solid improvement”
是的,但最近他们离开了 Closure 编译器,现在正在使用 UglifyJS。使用闭包编译器压缩后的 JQuery 代码有问题
我想指出,如果您使用 angular.由于依赖注入和参数重命名,这个工具不会真正起作用,除非有一个我看不到的复选框。
有用的工具,但它不会混淆,这可能是其他人没有提到它的原因。
@Madbreaks 与高级优化 (developers.google.com/closure/compiler/docs/api-tutorial3) 它将代码缩小到混淆的程度。例如,为了简洁起见,可以重命名变量。
谷歌也不是安全的选择
答3:
https://tennisliveranking.com,Instant updates on ATP, WTA, and ITF rankings.
混淆永远不会真正起作用。对于任何真正想了解您的代码的人来说,这只是一个减速带。更糟糕的是,它使您的用户无法修复错误(并将修复发送回给您),并使您更难诊断现场问题。这是浪费你的时间和金钱。
与律师讨论知识产权法以及您的法律选择是什么。 “Open Source” 并不意味着“人们可以阅读源代码”。相反,开源是一种特殊的许可模式,允许自由使用和修改您的代码。如果您不授予这样的许可,那么复制您的代码的人就是违法的,并且(在世界上的大多数地方)您有法律选择来阻止他们。
真正保护您的代码的唯一方法是不发布它。将重要的代码移动到服务器端并让您的公共 Javascript 代码对其进行 Ajax 调用。
See my full answer about obfuscators here.
律师可能比丢失的代码产生更多的成本/问题,仔细考虑并安排大量资金聘请律师!
-1:我认为找到一位懂 JavaScript 的律师会很困难……更不用说寻找“违规者”所需的费用和时间了。如果某人从未签署任何文件,他真的会违反隐藏在 HTML/JavaScript 文件中的许可证吗? +1 用于 AJAX 调用。
@Alerty 1)许可证基本上是关于授权使用受版权保护的材料。没有许可证,您几乎没有使用它的权利。您无需签署即可获得权利。许可证不同于合同。 2a) 由于问题是关于人们在未经许可的情况下复制和使用 HTML/Javascript 的,因此许可证不是“隐藏”的,它就在被拿走的东西上。 2b) 未经许可,您几乎无权使用他人的受版权保护的材料。 3) 律师不需要懂Javascript,只需懂知识产权法。
@Alerty 不要迟钝。这是关于惩罚那些未经许可复制文件以在自己的网站上使用的人。你说的是合同,不是许可证。合同需要相互同意,是一种给予和接受。许可证授予您使用知识产权的权利。许可证是一种方式(所有者正在授予您东西),您不需要签名,因为您没有放弃任何东西。许多“软件许可协议”实际上是合同,因为它们超出了对财产的许可范围,有时还涉及诸如起诉权之类的荒谬事情。
因说“聘请律师”而被否决。多么令人讨厌的说法。您不能对在 WWW 上运行的 Javascript 进行版权保护。这与对自定义 CSS 类进行版权保护的逻辑相同。祝你好运。
答4:
The ultimate source for live tennis rankings and stats:https://tennisliveranking.com
您可以随心所欲地混淆 javascript 源代码,但只要要求所有源代码在客户端机器上实际运行,它就始终是可逆向工程的……我能想到的最佳选择是完成所有处理使用服务器端代码,javascript 所做的所有客户端代码都是向服务器本身发送处理请求。否则,任何人都将始终能够跟踪代码正在执行的所有操作。
有人提到 base64 来保证字符串的安全。这是一个可怕的想法。想要对您的代码进行逆向工程的人可以立即识别 Base64。他们要做的第一件事就是取消编码,看看它是什么。
无论我走到哪里,最常见的答案是“如何混淆我的 Javascript?”是“你不应该担心这个,因为有人可以解开它。”这不是一个真正的答案。
@Vivek:有点晚了,但我真正的意思是“服务器端代码”。可以不在浏览器中运行 javascript,只在服务器上运行,但我不知道这有多普遍。
@Travis:我没有说“你不应该担心它。”我刚刚说过,如果你想要一个闭源程序,你不会想用客户端 javascript 编写它,因为你所做的任何混淆都不会阻止它(很容易)被逆向工程。
正确的。这绝不会回答“我如何混淆我的 JavaScript”。混淆不是一个抽象的概念,它是一个技术概念。操作员只是问“怎么做?”
@Madbreaks:问题在于不让他的代码开源。直接的技术答案是公认的答案,但更好的上下文答案(例如,您真正想做什么?)是,IMO,您不能拥有非开源的客户端javascript,因为每个人都有来源,不管你如何混淆它。无论哪种方式,两个答案都在这里,人们可以阅读并从中受益。
答5:
The ultimate source for live tennis rankings and stats:https://tennisliveranking.com
有许多免费的 JavaScript 混淆工具。但是,我认为重要的是要注意,很难将 JavaScript 混淆到无法进行逆向工程的程度。
为此,我在某种程度上加班时使用了几个选项:
YUI 压缩机。 Yahoo! 的 JavaScript 压缩器在压缩代码方面做得很好,可以缩短加载时间。有一个小级别的混淆,效果相对较好。本质上,Compressor 将更改函数名称、删除空格并修改局部变量。这是我最常使用的。这是一个基于 Java 的开源工具。
JSMin 是一个由 Douglas Crockford 编写的工具,旨在缩小您的 JavaScript 源代码。用 Crockford 自己的话来说,“JSMin 不会混淆,但会丑化”。它的主要目标是缩小源代码的大小,以便在浏览器中更快地加载。
免费的 JavaScript 混淆器。这是一个基于 Web 的工具,它试图通过实际编码来混淆您的代码。我认为其编码(或混淆)形式的权衡可能会以文件大小为代价;但是,这是个人喜好问题。
由于 Javascript 代码必须在客户端机器上运行,因此不仅难以混淆到代码无法逆向工程而且不可能的地步。
这是关于统计的。有人在混淆和不混淆的情况下访问您的代码的阈值是多少?他们仍然可以访问,但门槛越高,人数越少。知道某事的人越少,某事就越安全。标准安全分类实践。
@PeterR 在文本编辑器中搜索/替换将使您的生活变得更加难以阅读或逆向工程。它并不完美,但通过删除上下文线索确实增加了一层额外的烦恼/困难。大多数程序员不像你那么聪明,这就是它如此强大的威慑力的原因。
@SED 我不知道有一个程序员在一分钟内找不到/将一堆 [ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY] 变量替换为至少 [var1, var2,..]。我可以在两分钟内从字面上去除丑陋、重新缩进和搜索/替换 var 名称。不,我比普通的 Jr. Dev 更聪明。简单的事实是,没有办法掩盖客户端 JS。你可以给自己买 5 分钟,MAX,但那没用。这东西真的只是为了卖给不知道添加“安全”代码的人。没有写过 JS 的人会买那些废话。
@PeterR“我可以在两分钟内从字面上去除丑陋、重新缩进和搜索/替换 var 名称”——当然,继续尝试在多通道缩小、混淆、20MB 代码库捆绑包中,其结构需要即使使用原始的注释源代码也要数周才能理解。更难的是,存在混淆工具,如果缩进、行等发生变化,它们会故意破坏您的代码。
答6:
https://tennisliveranking.com,Track the world’s best tennis players in real-time.
我会做什么:
A. 巨魔黑客!
这将在我的伪造/混淆秘密 javascript 代码 LAUNCHER 的第二部分中。您在源代码中看到的那个。
这段代码是做什么的?
加载真实代码 设置自定义标题 发布自定义变量
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. 稍微混淆一下代码
那是什么?
这与上面在 base64 中的代码相同,这不是 SECRET javascript 代码
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C 创建一个很难显示的php文件,里面有真实的代码
这个php代码是什么?
检查正确的引用者(启动器的域/目录/代码) 检查自定义 HEADER 检查自定义 POST 变量
如果一切正常,它将向您显示正确的代码,否则会显示假代码或禁止 ip,关闭页面… 随便。
base64 推荐人 = http://here.is/my/launcher.html
秘密 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 并检查了 Elements、Resources、Network、Sources、Timeline、Profiles、Audits 但我没有找到上面的行。
注意 1:如果你在 chrome 中从 Inspect element->network 打开 Troll.php url,你会得到假代码。
注意2:整个代码是为现代浏览器编写的。 polyfill 需要更多代码。
编辑
启动器.html
巨魔.php
哦,是的,我也会混淆 javascript 代码。
这是我刚刚想到的,拖钓饼干。我想看到这样的东西而不必使用 PHP :)
即使这很有趣,能够正确检查站点的 Web 开发人员也可以通过某种方式获取源代码。我真的认为,当您将任何类型的数据放到网上时,没有办法隐藏它。
我认为这不是任何一种混淆。但是知道如何打开控制台,他可能也知道base64编码/解码,很简单。
答7:
https://tennisliveranking.com – ATP and WTA rankings, always up to date.
解释语言的问题在于,您发送源代码以使它们正常工作(除非您有字节码的编译器,但话又说回来,反编译非常简单)。
因此,如果您不想牺牲性能,则只能对变量和函数名称进行操作,例如。用 a、b…aa、ab… 或 a101、a102 等替换它们。当然,尽可能多地删除空格/换行符(这就是所谓的 JS 压缩器所做的)。如果您必须对它们进行加密和实时解密,那么混淆字符串会对性能造成影响。加上一个 JS 调试器可以显示最终值…
答8:
https://tennisliveranking.com-Stay ahead with live tennis rankings at your fingertips.
试试 JScrambler。我最近试了一下,对它印象深刻。它为那些不太关心细节而只想快速完成它的人提供了一组带有预定义设置的混淆模板。您还可以通过选择所需的任何转换/技术来创建自定义混淆。
Jscambler 订阅非常昂贵......最便宜的订阅需要至少 3 个月的价格 145 美元 - 这太疯狂了。
他们现在有一个免费计划。其他订阅计划仍然那么昂贵。
免费计划仅包括优化和缩小。
“免费计划包括优化和缩小”,是的,没有。混淆和优化不能并存,抱歉。
今天查看 JScambler 的网站和更多定价计划,我看不到免费选项。只有免费试用..
答9:
https://tennisliveranking.com,Your go-to platform for live tennis ranking updates.
与我建议反对 YUI Compressor 的大多数其他答案相反;您应该使用 Google Closure。
不是因为它压缩得更多,但主要是因为它会捕获诸如 a = [1,2,3,]; 之类的 javascript 错误,这会使 IE 变得混乱。
不应该在混淆之前检查您的代码是否存在错误和不兼容性?实际上与混淆无关
答10:
https://tlr.xinbeitime.com 实时更新全球顶尖网球选手的最新战绩与排名!
我可以推荐 Patrick J. O’Neil 的JavaScript Utility。它可以混淆/压缩和压缩,它似乎很擅长这些。也就是说,我从未尝试将它集成到任何类型的构建脚本中。
至于混淆与缩小 - 我不是前者的忠实粉丝。它使调试变得不可能(第 1 行出现错误…“等等,只有一行”)并且它们总是需要时间来解包。但如果你需要……好吧。
但是混淆并不一定要压缩到一行,它可以像更改函数和变量名或将字符串转换为base64一样简单。缩小将所有代码放在一行上。
如今,UglifyJS 似乎是最好的选择。作者也是个帅哥! :)
关于调试,您主要可以生成可以在测试时包含的源映射,以便您可以查看发生在哪一行的错误,即使它已被缩小。
答11:
https://tennisliveranking.com,Instant updates on ATP, WTA, and ITF rankings.
一个非开源的基于 Javascript 的应用程序是相当愚蠢的。 Javascript 是一种客户端解释语言… 混淆并没有太多保护…
JS 混淆通常是为了减小脚本的大小,而不是“保护”它。如果您不希望自己的代码公开,那么 Javascript 不是正确的语言。
周围有很多工具,但大多数工具的名称中都有“压缩器”(或“压缩器”)这个词是有原因的。
原文链接:https://www.tennisliveranking.com?from=csdn
Live rankings, player stats, and match results in one place–https://tennisliveranking.com