我如何保护JavaScript文件?

我知道隐藏源代码是不可能的,但是,例如,如果我必须将JavaScript文件从我的CDN链接到网页,而且我不希望人们知道这个脚本的位置和/或内容,是不是可能?

例如,要链接来自网站的脚本,我们使用:

<script type="text/javascript" src="http://somedomain.com/scriptxyz.js"> </script> 

现在,是可以隐藏脚本从哪里来的用户,或隐藏脚本的内容,仍然在网页上使用它?

例如,通过将其保存在我需要密码访问文件的私人CDN中,是否可行? 如果不是的话,会得到我想要的东西吗?

一个简单的答案很好的问题: 你不能

Javascript是一种客户端编程语言,因此它在客户端的机器上工作,所以你实际上不能从客户端隐藏任何东西。
混淆你的代码是一个很好的解决scheme,但还不够,因为虽然很难,但有人可以破译你的代码并“窃取”你的脚本。
有几种方法可以让你的代码很难被盗,但正如我所说的,没有什么是防弹的。

关于我的头顶,一个想法是限制从您embedded代码的页面外部访问您的外部js文件。在这种情况下,如果您有

 <script type="text/javascript" src="myJs.js"></script> 

有人试图访问浏览器中的myJs.js文件,他不应该被授予对脚本源的任何访问权限。
例如,如果您的页面是用PHP编写的,则可以通过include函数包含脚本,并让脚本决定是否安全地返回它的源代码。
在这个例子中,你需要外部的“js”(用php编写)文件myJs.php

 <?php $URL = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; if ($URL != "my-domain.com/my-page.php") die("/\*sry, no acces rights\*/"); ?> // your obfuscated script goes here 

这将包括在您的主页my-page.php

 <script type="text/javascript"> <?php include "myJs.php"; ?>; </script> 

这样,只有浏览器才能看到js文件的内容。

另一个有趣的想法是,在脚本的最后,你删除了你的dom脚本元素的内容,以便在浏览器评估你的代码后,代码消失:

 <script id="erasable" type="text/javascript"> //your code goes here document.getElementById('erasable').innerHTML = ""; </script> 

这些都不过是简单的黑客攻击,我无法强调这一点:不能,完全保护你的js代码,但他们肯定会嘲笑那些试图“窃取”你的代码的人。

更新:

最近我遇到了一个由Patrick Weid编写的关于如何隐藏你的js代码的非常有趣的文章 ,他揭示了一种不同的方法:你可以将你的源代码编码成一个图像! 当然,这也不是子弹的certificate,但它是你可以在你的代码周围build立的另一个围栏
这种方法背后的想法是,大多数浏览器可以使用canvas元素对图像进行像素操作。 而且由于canvas像素由4个值(rgba)表示,所以每个像素的值可以在0-255的范围内。 这意味着你可以在每个像素中存储一个字符(实际上是ascii码)。 编码/解码的其余部分是微不足道的。
谢谢,帕特里克!

你唯一能做的就是混淆你的代码,使其更难阅读。 不pipe你做什么,如果你想要在他们的浏览器执行JavaScript,他们将不得不有代码。

阅读这个 。 它有一个非常好的隐藏你的代码在查看源代码和debugging工具,如萤火虫。

据我所知,这是不可能的。

您的浏览器必须有权访问JS文件才能执行它们。 如果浏览器可以访问,那么浏览器的用户也可以访问。

如果你的密码保护你的JS文件,那么浏览器将无法访问它们,这首先打败了JS的目的。

忘记它,这是不可行的。

不pipe你尝试什么都行不通。 所有的用户需要做的发现你的代码,它的位置是看在萤火虫净选项卡或使用提琴手 ,看看有什么要求。

就在我头顶,你可以做这样的事情(如果你可以创build服务器端脚本,这听起来可以):

发送一个AJAX请求到一个PHP页面(可以是任何东西;我只是自己使用它),而不是像正常一样加载脚本。 让PHPfind文件(也许在服务器的非公开部分),用file_get_contents打开它,并以string的forms返回(读取: echo )内容。

当这个string返回到JavaScript时,让它创build一个新的script标记,用刚刚收到的代码填充它的innerHTML ,并将标记附加到页面上。 (你可能有这个问题, innerHTML可能不是你所需要的,但你可以试验。)

如果你这样做了很多,你甚至可能想要设置一个接受带有脚本名字的GETvariables的PHP页面,这样你就可以使用相同的PHPdynamic地获取不同的脚本。 (也许你可以用POST代替,让其他人看到你在做什么更难一些,我不知道。)

编辑:我以为你只是试图隐藏脚本的位置 。 如果你想隐藏脚本本身,这显然不会有什么帮助。

Google Closure编译器 , YUI压缩器 , Minify , / Packer / …等,都是压缩/混淆你的JS代码的选项。 但是他们都不能帮助你从用户隐藏你的代码。

任何有知识的人都可以使用JS Beautifier等工具轻松地解码/解密你的代码。 你把它命名。

所以答案是,你总是可以让你的代码更难读/解码,但是肯定没有办法隐藏。

我认为唯一的办法是把所需的数据放在服务器上,并且只允许login用户根据需要访问数据(你也可以在服务器端进行一些计算)。 这不会保护您的JavaScript代码,但没有服务器端代码,使其无法运行

正如我在评论中所说的,我在gion_13之前回答(请读),你真的不行。 不与JavaScript。

如果您不希望代码在客户端可用(不需要很大努力就可以使用),我的build议是使用经过处理的服务器的PHP(ASP,Python,Perl,Ruby,JSP + Java-Servlet)只有计算/代码执行的结果被提供给用户。 或者,如果你愿意的话,即使是Flash或Java-Applet,它们也可以让客户端计算/代码执行,但是被编译,因此很难反向引擎(因此不是不可能的)。

只是我2美分。