如何保护JavaScript文件?


75

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

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

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

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

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



1
任何对JS有半点了解的人都可以复制您正在做的事情。除非,否则,您所做的事情确实是具有开创性的……这个问题在该网站上已被多次回答,而且答案始终相同……
Russell Dias

使用Encode.js:encodejs.devincity.com
nachshon,

devincity的encode.js使用什么机制?我尝试过这个。它工作正常。有办法解码吗?
Vignesh Bhaskar

无法确保JS 100%免受间谍眼的侵害,但您可以接近100%。我开发了一种相当简单且易于实现的方法,它几乎使任何人都无法突破。它基于使用jQuery.getScript从PHP中获取JS作为密码加密的字符串,然后解密JS并使用eval()执行它的基础。加密的JS仅显示在“工具”下的“网络”下,您需要知道密码才能解密。棘手的部分是找到一种创新的方式来传递和隐藏JS解密的PW。
GeniusDesign 2018年

Answers:


104

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

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码)。其余的编码/解码很简单。
谢谢,帕特里克!


添加一些内容:发誓我已经看到了,我要在两个不同的站点中进行搜索,这两个站点都是Social Video Downloading(社交视频下载),它们显然在一个中使用javascript,在另一个中使用PHP,但是当您查看时在源代码中,表单的代码是唯一的,即使您输入了URL,仅此而已,也没有脚本调用,即使他们使用SWFObject在JWplayer中播放视频也是如此。我现在不记得这些名字了,但是他们在那里:S
Jmlevick 2011年

@Jmlevick的php部分只是一个例子...我敢肯定,它可以在大多数服务器端语言中实现
gion_13 2011年

9
恐怕gion_13此处提供的示例都不能真正保护您的代码不被检索。在第一种情况下,仅保存网页的客户端副本也将保存js代码。在第二篇中,我敢打赌,看原始页面源代码,所有代码仍将可见。您只能对<em> try <em>进行保护以保护您的js代码是混淆。但是即使在这种情况下,该代码(尽管更难阅读)将始终在客户端可用=如果有人真的想“窃取”它,那么您真的无法阻止他们……您必须克服这一点。
danicotra

1
我尝试了第二种方法,但是没有用,代码始终可以在客户端使用,我们唯一能做的就是使它更难被窃取。
saiyan '17

1
谢谢@ gion_13,您的回答给了我一个主意。我有一个登录页面,我只是在包含js文件之前检查用户是否已经登录。你很棒!
丹·安吉洛·阿尔卡纳尔

14

您唯一可以做的就是混淆您的代码,使其更难以阅读。无论您做什么,如果要让javascript在他们的浏览器中执行,它们都必须具有代码。


4

就在我脑海中,您可以执行以下操作(如果您可以创建服务器端脚本,听起来就可以):

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

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

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

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


3

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

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

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


3

算了,这是行不通的。

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


3

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

任何拥有扎实知识的人都可以使用JS Beautifier之类的工具轻松地对您的代码进行解码/去模糊化。随便你

因此,答案是,您总是可以使代码更难以阅读/解码,但是可以肯定没有隐藏的方法。


2

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


1

我在这里与其他所有人都同意:在客户端上使用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秒的窗口时间,则该方法将不起作用


0

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

如果您不希望代码在客户端可用(无需费劲就可以窃取),我的建议是使用经过处理的服务器的PHP(ASP,Python,Perl,Ruby,JSP + Java-Servlets) -方面,仅将计算/代码执行的结果提供给用户。或者,如果您愿意的话,甚至可以使用Flash或Java-Applet,它们可以执行客户端计算/代码,但可以进行编译,因此较难进行反向工程(因此并非不可能)。

只是我的2美分。


0

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


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进行编码javascript .js并将其作为Cookie






现在让我总结一个例子

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

这样人们就无法窃取您的代码

但我不建议这样做,因为

  1. 这是一个漫长的过程
  2. 压力太大了
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.