我如何保护javascript文件?

时间:2011-01-22 08:11:54

标签: javascript source-code-protection

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

例如,要从网站链接脚本,我们使用:

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

现在,是否可以向脚本所在的用户隐藏,或隐藏脚本内容并仍然在网页上使用它?

例如,通过将其保存在需要密码来访问文件的私有CDN中,这会有效吗?如果没有,那么什么可以得到我想要的东西?

12 个答案:

答案 0 :(得分:89)

简单回答的好问题:你不能

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

在我的脑海中,一个想法是限制从嵌入代码的页面外部访问外部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代码,但他们可以肯定会惹恼那些试图“窃取”你的代码的人。

更新

我最近遇到a very interesting article撰写的关于如何隐藏js代码的Patrick Weid,他揭示了一种不同的方法:您可以将源代码编码为图像!当然,这也不是防弹,但它是你可以围绕你的代码构建的另一个围栏
这种方法背后的想法是大多数浏览器可以使用canvas元素对图像进行像素操作。并且由于画布像素由4个值(rgba)表示,因此每个像素可以具有0-255范围内的值。这意味着您可以在每个像素中存储一个字符(实际上是ascii代码)。其余的编码/解码是微不足道的 谢谢,帕特里克!

答案 1 :(得分:12)

您唯一能做的就是obfuscate您的代码,使其更难以阅读。无论你做什么,如果你想让javascript在他们的浏览器中执行,他们就必须拥有代码。

答案 2 :(得分:6)

Read this。它有一种非常好的方法可以在视图源和调试工具(如firebug)中隐藏代码。

答案 3 :(得分:3)

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

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

如果您使用密码保护您的JS文件,那么浏览器将无法访问它们,从而无法首先使用JS。

答案 4 :(得分:3)

就在我的脑海中,你可以做这样的事情(如果你可以创建服务器端脚本,听起来就像你一样):

不是像平常那样加载脚本,而是向PHP页面发送一个AJAX请求(它可以是任何东西;我只是自己使用它)。让PHP找到文件(可能在服务器的非公共部分),用file_get_contents打开它,然后以字符串形式返回(读取:echo)内容。

当此字符串返回JavaScript时,让它创建一个新的script标记,使用您刚收到的代码填充其innerHTML,并将标记附加到该页面。 (你可能有问题; innerHTML可能不是你需要的,但你可以试验。)

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

编辑:我以为您只是想隐藏脚本的位置。如果您试图隐藏脚本本身,这显然无济于事。

答案 5 :(得分:3)

忘掉它,这是不可行的。

无论你尝试什么,它都行不通。用户需要做的就是发现您的代码,其位置是查看firebug中的网络标签,或使用fiddler查看正在发出的请求。

答案 6 :(得分:3)

Google Closure CompilerYUI compressorMinify/Packer/ ...等是压缩/混淆JS代码的选项。但是它们都不能帮助您隐藏代码和用户。

任何拥有良好知识的人都可以使用JS Beautifier等工具轻松解码/解混淆代码。你的名字。

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

答案 7 :(得分:2)

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

答案 8 :(得分:0)

正如我在gion_13回答之前留下的评论中所说(请阅读),你真的不能。不是用javascript。

如果您不希望代码在客户端可用(=无需付出很大努力), 我的建议是利用服务器端处理的PHP(ASP,Python,Perl,Ruby,JSP + Java-Servlets),并且只向用户提供计算/代码执行的结果。或者,如果您愿意,甚至是Flash或Java-Applet,它允许客户端计算/代码执行但是编译后因此更难以反向引擎(因此并非不可能)。

只需2美分。

答案 9 :(得分:0)

我在这里与其他所有人都一样:在客户端上使用JS时,这只猫已经脱颖而出,没有什么可以做到的万无一失。

话虽如此;在某些情况下,我这样做是为了给那些想要看一下代码的人带来一些障碍。算法大致是这样工作的

  1. 服务器创建3个哈希值和盐值。一个用于当前时间戳,另外两个用于接下来的2秒。这些值通过Ajax作为逗号分隔的字符串发送给客户端。从我的PHP模块。在某些情况下,我认为您可以在形成页面时将这些值硬烘焙到HTML的脚本部分中,并在哈希的使用结束后删除该脚本标记。服务器受CORS保护,并且执行所有常用的SERVER_NAME等检查(这不是什么保护措施,但至少对脚本小子提供了一些抵制)。

  2. 如果服务器检查是否确实有经过身份验证的用户的客户端这样做,那就很好了

  3. 然后,客户端通过ajax调用将相同的3个哈希值发送回服务器,以获取所需的实际JS。服务器根据那里的当前时间戳检查哈希值...这三个值确保在3秒的窗口内发送数据,以解决浏览器和服务器之间的延迟

  4. 需要让服务器确信,哈希值之一是 正确匹配;如果是这样,它将把重要的JS发送回来 给客户。这是一个简单粗略的“一次性使用密码” 不需要后端的任何数据库。

  5. 这意味着,自从生成第一组哈希以获取实际JS代码以来,任何黑客都只有3秒的窗口期。

  6. 整个客户端代码都可以在IIFE函数中,因此客户端中的某些变量甚至更难从Inspector控制台读取

    这不是一个深层的解决方案:坚定的黑客可以注册,获取帐户,然后要求服务器生成前三个哈希值。通过技巧绕过Ajax和CORS;然后让客户执行第二次调用以获取实际代码-但这是一个合理的工作量。

此外,如果服务器使用的Salt是基于登录凭据的;服务器可能能够检测到谁是试图窃取敏感JS的用户(在窃取敏感JS之后,服务器需要针对用户的行为做更多其他工作,如果发现该人,则阻止该人,例如例如,没有进行预期的其他活动)

在hackathon上已完成了此版本的原始版本:http://planwithin.com/demo/tadr.html如果服务器检测到太多延迟,并且超过了3秒的窗口周期,则将无法正常工作

答案 10 :(得分:0)

您还可以为应用程序/ JavaScript设置mime类型,使其以PHP,.NET,Java或您使用的任何语言运行。过去,我已经对动态CSS文件执行过此操作。

答案 11 :(得分:0)

我知道这是回答这个问题的错误时间,但我只是想到了一些事情

我知道这可能会带来压力,但至少可能仍然有效

现在的诀窍是创建许多服务器端编码脚本,它们必须是可解码的(例如,一个脚本用数字替换所有元音并在每个辅音中添加字母“ a”这样,“ bat”一词将变为ba1ta),然后创建一个脚本,该脚本将在编码脚本之间随机分配,并使用所用编码脚本的名称创建一个cookie(快速提示:请尽量不要将编码脚本的实际名称用于cookie,例如,如果我们的cookie名为“ encoding_script_being_used”,并且随机脚本选择了一个名为MD10的编码脚本,请尝试不要将MD10用作cookie的值,而应使用“ encoding_script4567656”以防止猜测),然后在创建cookie之后脚本将检查名为“ encoding_script_being_used”的cookie并获取该值,然后它将确定正在使用的编码脚本。

现在在编码脚本之间进行随机化的原因是,服务器端语言将随机化用于解码javascript.js的脚本,然后创建一个会话或cookie来了解所使用的编码脚本 那么服务器端语言还将对您的javascript .js进行编码,并将其作为 cookie






现在让我总结一个例子

PHP在一系列编码脚本之间随机化并加密javascript.js,然后创建一个cookie,告诉客户端使用了哪种编码脚本,然后客户端语言对javascript.js cookie(显然已编码)进行了解码

所以人们无法窃取您的代码

但是我不建议这样做,因为

  1. 这是一个漫长的过程
  2. 压力太大