我该如何防止JavaScript代码被盗?

19
实际上,我正在开发一个Chrome扩展和一个jQuery插件来上传并在Codecanyon上销售它。当我“检查源代码”页面并单击“资源”选项卡时,Javascript文件看起来是空的。Codecanyon是如何做到的?我也想在自己的网站上实现防盗版功能,但我不知道该怎么做。我了解PHP和Javascript,并且没有可行的方法,因为浏览器下载文件以执行它。您可以在这里查看示例。

7
文件为空是因为实际的倒计时JS代码在jquery.js文件中,只要它在客户端,就无法隐藏它。 - Arthur
2
请返回翻译后的文本:http://en.wikipedia.org/wiki/Obfuscation_(software) - http://www.dmoz.org/Computers/Programming/Languages/JavaScript/Tools/Obfuscators/ - mplungjan
7个回答

35

因为你的浏览器需要它来执行,所以你无法隐藏它。就是这么简单。

你需要明白它是在客户端执行的脚本。它没有编译(也就是说它不是二进制(0和1的机器语言))。所以它是可以自由阅读的。

尽管如此,你可以使用像 YUI compressor 这样的工具来混淆它。

基本上,这种工具会删除额外的空格、制表符、换行符,重命名方法(比如将方法“a”表示为“MyShinyMethodWhoMakesNiceStuff”)和变量。这使得代码非常难以阅读和理解。因此,逆向工程更难实现。

有些人使用一些技巧,比如base64或其他编码和解码部分的代码与函数一起使用,但这只是技巧,无法欺骗眼光敏锐的人。

通过混淆,您可以让人们花费更多时间分析您的代码和窃取,因此窃取变得更加复杂,需要时间。假设您制作了一个不错的JavaScript插件,可以将所有白色背景变为紫色(好吧,这不是很好的例子,但只是为了有一个形象的例子)。有人可能想要窃取它,并将其改为蓝色而不是紫色。如果代码被混淆,他可能会认为复制您的想法并使用自己的代码和蓝色背景重新编写它更容易,比反向工程和理解您的代码更省时间,在未来也更容易维护。最终,他将“只”窃取您的想法而不是您的代码。
我认为最终只是时间问题。

1
但是使用这些工具中的任何一个,代码都可以被反转(即使它很难读取)。 - Arthur
如果有一款可以随机生成名称/变量的应用程序,那将是很酷的事情。 - Anonymous Penguin
3
这与数字版权管理(DRM)存在相同的概念缺陷:你必须拥有受版权保护的材料和一个阅读器/播放器才能消费它。由于实际上不存在真正的技术障碍,DRM倡导者试图使用法律来阻止你拥有可控制的阅读器/播放器。但是我们不太可能拥有不显示执行Javascript的浏览器(如果有这样的浏览器,它将扼杀JS创新)。 - Nathan Long
1
好的混淆器可以使代码几乎无法恢复,以至于这根本不值得去做。 - Andrey
@loops:那是一个老技巧了..你有没有看过滚动条? - Karoly Horvath
显示剩余6条评论

13
如果你看到它是空的,那就意味着它是空的。没有办法从必须执行代码的客户端隐藏你的JavaScript代码。

11
你只能尝试通过代码压缩和混淆来减少可读性,但代码仍然会被传输并可能被反向工程化。
实际上,你示例中的代码是与jquery.js文件一起下载的。

2

1

如果您正在按每个站点的方式对代码进行许可,我建议在Javascript中进行域锁定。

您可以通过在加密文件的某个地方检查window.location来自行完成此操作。这并不会非常安全,但对于90%的用户而言,他们只需将脚本放入目录中并希望它能正常工作,它将提供一定程度的威慑作用。

您还可以使用https://domainlockjs.com(免费)轻松锁定脚本到域名。这是一个稍微更好的解决方案,因为DomainLockJS会引发难以跟踪的错误,并且很难进行调试。

更复杂的方法涉及使用Ajax脚本注入,并允许特定的域名访问脚本/不触发XSS错误。这是最难设置的方法,但是如果您注入大量JS,则可能最难绕过。

然而,所有这些都可以被熟练的编码人员规避...您只是使事情变得困难,而不是不可能。



-8

Liblock是我自己构建的一个小工具。它加密你的JS源代码 - 这不是简单的混淆,而是通过加密来提供良好的安全性。

当你在客户端检查DOM时,你所看到的只是每个绑定到HTML头部的脚本的 "nplreq(url)"。

在这里可以看到它的工作原理 liblock-demo - 这仅仅是一个用于隐藏 "nopro_lib" 和 "xscroll.js" 脚本的演示。

加密和解密对浏览器来说完全透明。它经过了在PC上测试的Firefox、Chrome、Opera、Konqueror、IE8-10,以及在Android平板上测试的Dolphin和Safari验证。

源代码被安全地隐藏起来,只有经过巨大努力才能再次显露出来。加密采用AES(Rijndael 256),使用一次性密钥,客户端与(liblock-)服务器之间使用Diffie-Hellman协商生成。


8
“good security by encryption” - 这是胡说八道。如果浏览器可以解密,其他人也可以这样做。因此,它实际上比混淆更糟糕。 - ThiefMaster
2
@ThiefMaster,看起来在控制台输入$('script')就足以打破这里的安全性。 - Denys Séguret

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接