【问题标题】:How do I protect javascript files?如何保护 javascript 文件?
【发布时间】:2011-06-13 14:27:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 任何对 JS 有半点了解的人都可以复制你正在做的事情。除非,你正在做一些真正开创性的事情......这个问题已经在这个网站上回答了很多次,答案总是一样......
  • 使用 Encode.js : encodejs.devincity.com
  • devincity 的 encode.js 使用什么机制?我尝试过这个。它工作正常。有什么办法可以解码吗?
  • 不可能 100% 保护 JS 免受窥探,但您可以非常接近 100%。我开发了一种相当简单且易于实施的方法,它使任何人几乎都无法突破。它基于使用 jQuery.getScript 从 PHP 获取 JS 作为密码加密字符串,然后解密 JS 并使用 eval() 执行它。加密后的 JS 只会显示在“网络”下的开发工具中,您需要知道密码才能解密。棘手的部分是找到一种创造性的方式来传递和隐藏 JS 解密的 PW。

标签: javascript source-code-protection


【解决方案1】:

我知道现在回答这个问题的时机不对,但我只是想到了一些事情

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

现在的诀窍是创建很多服务器端编码脚本,它们必须是可解码的(例如,用数字替换所有元音并将字母“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. 压力太大

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我同意这里的其他人的观点:在客户端使用 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 秒窗口期,这将不起作用

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

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

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

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

        只要我的 2 美分。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

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

              任何知识渊博的人都可以使用JS Beautifier 等工具轻松解码/去混淆您的代码。你的名字。

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

              【讨论】:

                【解决方案9】:

                算了,这是行不通的。

                无论你尝试什么都行不通。用户只需在firebug 的网络选项卡中查找您的代码及其位置所需要做的一切,或使用fiddler 查看正在发出的请求。

                【讨论】:

                  【解决方案10】:

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

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

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

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

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

                  【讨论】:

                    【解决方案11】:

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

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

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-04-30
                      • 1970-01-01
                      • 2014-01-10
                      • 1970-01-01
                      • 2017-03-13
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多