我如何保护javascript文件?

Jml*_*ick 66 javascript source-code-protection

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

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

<script type="text/javascript" src="http://somedomain.com/scriptxyz.js">
</script>
Run Code Online (Sandbox Code Playgroud)

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

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

gio*_*_13 96

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

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

在我的脑海中,一个想法是限制从嵌入代码的页面外部访问外部js文件.在这种情况下,如果你有

<script type="text/javascript" src="myJs.js"></script>
Run Code Online (Sandbox Code Playgroud)

并且有人试图在浏览器中访问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
Run Code Online (Sandbox Code Playgroud)

这将包含在您的主页my-page.php中:

<script type="text/javascript">
    <?php include "myJs.php"; ?>;
</script> 
Run Code Online (Sandbox Code Playgroud)

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

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

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

这些都只是简单的黑客攻击,我不能强调这一点:不能,完全保护你的js代码,但他们可以肯定会惹恼那些试图"窃取"你的代码的人.

更新:

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

  • 我担心gion_13这里提供的所有示例都不能真正保护您的代码不被检索.在第一种情况下,只需保存网页的客户端副本也将保存js代码.在第二个中,我打赌所有代码仍然可见,看着原始页面源.您可以做的唯一事情是<em>尝试<em>来保护您的js代码是混淆; 但即使在这种情况下,代码(虽然难以阅读)将始终是客户端可用=如果有人真的想"偷"它,你真的无法阻止他们......你必须克服这个. (7认同)

GWW*_*GWW 13

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

  • 也许是一个错字 - 你的意思是"混淆"? (3认同)

小智 6

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

  • 那是浪费时间阅读,显然不起作用 (3认同)