如何保护javascript文件?

IT技术 javascript source-code-protection
2021-01-22 04:26:25

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

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

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

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

例如,将它保存在我需要密码才能访问文件的私人 CDN 中,这样可行吗?如果没有,有什么办法可以得到我想要的东西?

6个回答

好问题,答案很简单:你不能

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>

这些都只是简单的 hack,不能,我不能强调这一点:不能,完全保护您的 js 代码,但它们肯定会激怒试图“窃取”您的代码的人。

更新:

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

@Jmlevick php 部分只是一个例子......我相信它可以在大多数服务器端语言中实现
2021-03-23 04:26:25
恐怕 gion_13 在这里提供的任何示例都不能真正保护您的代码不被检索。在第一种情况下,只需保存网页的客户端副本也将保存 js 代码。在第二个中,我敢打赌所有代码在查看原始页面源时仍然可见。您可以对 <em>try<em> 做的唯一一件事是混淆以保护您的 js 代码;但即使在这种情况下,代码(虽然更难阅读)将始终在客户端可用 = 如果有人真的想“窃取”它,你真的无法阻止他们......你必须克服这一点。
2021-03-31 04:26:25
添加一些东西:我发誓我已经看到了这一点,我在两个不同的站点中要求的内容,两个都是社交视频下载,他们显然在一个站点中使用了 javascript,在另一个站点中使用了 PHP,但是当您查看它们时源代码,只有当你输入 URL 时,表单的代码,仅此而已,没有脚本调用,即使他们使用 SWFObject 在 JWplayer 中播放视频也是如此。我现在不记得名字了,但他们在那里:S
2021-04-02 04:26:25
谢谢@gion_13,你的回答给了我一个想法。我有一个登录页面,我只是在包含我的 js 文件之前检查用户是否已经登录。你很棒!
2021-04-07 04:26:25
我尝试了第二种方法,但它没有用。代码将始终在客户端可用。我们唯一能做的就是让它更难被窃取。我想。
2021-04-14 04:26:25

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

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

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

当这个字符串返回给 JavaScript 时,让它创建一个新script标签,innerHTML用你刚收到的代码填充它,然后将标签附加到页面上。(您可能对此有问题;innerHTML可能不是您需要的,但您可以进行试验。)

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

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

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

任何有丰富知识的人都可以使用JS Beautifier等工具轻松解码/去混淆您的代码你说出它的名字。

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

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

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

如果你用密码保护你的 JS 文件,那么浏览器将无法访问它们,这违背了拥有 JS 的初衷。