77

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

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

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

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

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

4

12 回答 12

108

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

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 代码,但他们肯定会激怒试图“窃取”你的代码的人。

更新:

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

于 2011-01-22T12:22:09.483 回答
14

您唯一能做的就是混淆您的代码,使其更难阅读。无论您做什么,如果您希望 javascript 在他们的浏览器中执行,他们都必须拥有代码。

于 2011-01-22T08:14:58.130 回答
4

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

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

当这个字符串返回到 JavaScript 时,让它创建一个新script标签,用您刚刚收到的代码填充它innerHTML,并将标签附加到页面上。(您可能会遇到麻烦;innerHTML可能不是您需要的,但您可以进行实验。)

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

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

于 2011-01-22T08:17:05.563 回答
4

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

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

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

于 2011-01-22T08:37:41.713 回答
3

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

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

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

于 2011-01-22T08:15:14.177 回答
3

算了,这是不可行的。

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

于 2011-01-22T08:17:20.757 回答
2

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

于 2013-03-26T19:28:10.503 回答
1

我同意这里的其他人的观点:有了客户端上的 JS,猫就出局了,没有什么可以做到完全万无一失。

话说回来; 在某些情况下,我这样做是为了给那些想要查看代码的人设置一些障碍。这就是算法的工作原理(大致)

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

  2. 如果服务器检查是否确实有经过身份验证的用户的客户端在执行此操作,那就太好了

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

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

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

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

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

此外,如果服务器使用的 Salt 是基于登录凭据的;服务器可能能够检测到谁是试图检索敏感 JS 的用户(服务器需要在敏感 JS 被检索后对用户的行为做一些额外的工作,如果该人阻止该人,比如说例如,没有做一些其他预期的活动)

一个旧的,粗略的版本是在这里为黑客马拉松完成的:http : //planwithin.com/demo/tadr.html 如果服务器检测到太多延迟,并且超过 3 秒窗口期,这将不起作用

于 2019-12-07T08:27:59.423 回答
0

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

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

只是我的2美分。

于 2013-10-21T19:15:56.640 回答
0

您还可以为应用程序/JavaScript 设置一个 mime 类型,以作为 PHP、.NET、Java 或您正在使用的任何语言运行。我过去为动态 CSS 文件做过这个。

于 2020-05-24T15:14:11.810 回答
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. 压力太大
于 2020-07-16T20:13:53.517 回答
-1

使用 nwjs 我认为很有帮助它可以编译到 bin 然后你可以用它来制作 win、mac 和 linux 应用程序

于 2022-01-30T07:04:34.920 回答