如何防止您的 JavaScript 代码被盗、复制和查看?

IT技术 javascript security
2021-01-21 22:35:08

我知道 100% 的保护是不可能的,但是对于大多数用户来说,高的或有效的东西是不可能的。

例如,我遇到了一个站点,在该站点中查看当前页面的源没有返回任何内容。

在另一种情况下,从浏览器访问或尝试下载 .js 文件本身

http://gget.com/somesecret.js

会重定向你和东西。

如果你混淆你的代码,解码它会非常困难吗?如果是这样,那也是另一个很好的解决方案(推荐什么软件)?

6个回答

这根本不可能。

为了让访问者的浏览器能够执行脚本,他们必须能够下载它。无论您尝试使用 JS、服务器权限等进行何种诡计,在一天结束时,它们始终只能使用wget http://example.com/yourcoolscript.js. 即使他们不能(例如,您需要该请求的“秘密”标头),这也可能会抑制大多数浏览器的行为,同时不会阻止有决心的人进行查看。

从根本上说,由于 JS 是在客户端执行的,因此客户端必须有权访问“原始”JS 文件。

您可以做的一件小事是混淆,这会有所帮助。但是由于 JS 是被解释的,它也是它自己的反混淆器 - 请参阅我之前的答案之一作为示例。

基本上 - “如果你建造它,他们会看起来”。:-)

看看这个网站samy.pl
2021-03-17 22:35:08
Jesper - 我同意,这就是我所说的“不阻止一个坚定的人看”的大致意思。浏览器必须能够在正常操作中看到文件,并且任何人都可以像浏览器一样表现得自己来获取文件。
2021-03-24 22:35:08
可以在浏览器和服务器之间放置一些 TCP/IP 侦听器,通过它您可以看到它们之间通信的 HTML 和 JavaScript。所以“秘密标题”真的没有任何好处。
2021-04-05 22:35:08
@Jesper 这样的监听器已经存在并且易于使用。设置缓存 Web 代理(例如 squid)或像 fiddler 这样的 http 流量嗅探器,您就可以开始使用了。
2021-04-06 22:35:08

有两种用户:一种是不在乎的大群体。没有必要防范他们。

然后,有一群人真的很想看看你是怎么做到的。没有办法防范他们。他们拥有所有工具和知识来规避您可以提出的任何保护措施。你可以使用混淆,但这会花费你金钱和时间,所以最终你只能输。

创造一个伟大的产品并提供良好的支持,人们将愿意为此付费。城堡建造在过去并不顺利(付出了很多努力,只用了几块石头就可以把它们拆掉),今天肯定行不通了。

如果你担心你的想法会被盗,那就找一份新工作,因为他们会被盗,你无能为力。

您可以混淆您的 Javascript。在野外有很多工具可以做到这一点,例如http://www.javascriptobfuscator.com/然而,它不会阻止任何人看到代码,但会使代码更难阅读。

我会说混淆使代码更难理解,而不是阅读。这些工具会将标识符名称更改为一些随机生成的代码。反混淆工具只能美化代码。它永远无法找到标识符的实际用途或名称。所以这对未来的读者来说毫无意义。
2021-03-24 22:35:08
它将如何保护代码?去混淆和混淆一样容易。 去混淆链接
2021-03-30 22:35:08
它不会。如前所述,它只会让阅读变得更加困难。
2021-04-01 22:35:08

如果您有大秘密,请将它们保存在服务器上。

然后将您所有的 JS 文件捆绑在一个文件中,您将混淆该文件。
这应该可以防止很多人走得更远,并减少大小和 http 调用。
但这不会阻止真正的坏人,如果有的话。

我们正在构建一个 JS 重的应用程序,很久以前就治愈了这种偏执。
事实上,我们做了相反的事情。

既然没有什么可以保护的,为什么不开源有用的部分并从其他人那里获得反馈呢?
试试吧,你不会失望的。

一种想法是使用WebSockets通过将文件投放JavaScript的浏览器socket.listener,并运行eval这样,任何人都很难看到实际的“源”,因为套接字的连接已经关闭。

http://samy.pl的主页上可以看到另一个惊人的策略它使用空格(\u0020)和制表符(\u0009)作为字节密码来隐藏 JS 代码!

如果你查看源码,你只能看到 1 行实际的 JS 代码:http : //pastebin.com/e0pqJ8sB 如果你能弄清楚它是如何工作的,你自己看看(不剧透!)

至于混淆器,请参阅http://utf-8.jp/public/jjencode.html(和/或其他版本)

这个免费的混淆器上运行的客户端,并产生乱码是unminify.comjsbeautifier甚至不能解码:

$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();

原始代码:

alert("Hello, JavaScript")

两个美化网站的输出:

$ = ~[];
$ = {
    ___: ++$,
    $$$$: (![] + "")[$],
    __$: ++$,
    $_$_: (![] + "")[$],
    _$_: ++$,
    $_$$: ({} + "")[$],
    $$_$: ($[$] + "")[$],
    _$$: ++$,
    $$$_: (!"" + "")[$],
    $__: ++$,
    $_$: ++$,
    $$__: ({} + "")[$],
    $$_: ++$,
    $$$: ++$,
    $___: ++$,
    $__$: ++$
};
$.$_ = ($.$_ = $ + "")[$.$_$] + ($._$ = $.$_[$.__$]) + ($.$$ = ($.$ + "")[$.__$]) + ((!$) + "")[$._$$] + ($.__ = $.$_[$.$$_]) + ($.$ = (!"" + "")[$.__$]) + ($._ = (!"" + "")[$._$_]) + $.$_[$.$_$] + $.__ + $._$ + $.$;
$.$$ = $.$ + (!"" + "")[$._$$] + $.__ + $._ + $.$ + $.$$;
$.$ = ($.___)[$.$_][$.$_];
$.$($.$($.$$ + "\"" + $.$_$_ + (![] + "")[$._$_] + $.$$$_ + "\\" + $.__$ + $.$$_ + $._$_ + $.__ + "(\\\"\\" + $.__$ + $.__$ + $.___ + $.$$$_ + (![] + "")[$._$_] + (![] + "")[$._$_] + $._$ + ",\\" + $.$__ + $.___ + "\\" + $.__$ + $.__$ + $._$_ + $.$_$_ + "\\" + $.__$ + $.$$_ + $.$$_ + $.$_$_ + "\\" + $.__$ + $._$_ + $._$$ + $.$$__ + "\\" + $.__$ + $.$$_ + $._$_ + "\\" + $.__$ + $.$_$ + $.__$ + "\\" + $.__$ + $.$$_ + $.___ + $.__ + "\\\"\\" + $.$__ + $.___ + ")" + "\"")())();

希望对有需要的人有所启发!

我只想在评估之前修补 eval 以输出代码
2021-03-13 22:35:08
我不能在 eval 附近放置一个断点,检查它试图处理的变量的值并获取 Javascript 吗?我认为这是相当微不足道的...
2021-03-15 22:35:08
@Mironline 整个页面中的家伙,使用“空格”和“制表符”的组合来隐藏他们的代码,(空格= 0,制表符= 1)。之后,他用 ".source.replace(/.{7}/g,function(w){document.write(String.fromCharCode(parseInt(w.replace(//g,'0').replace(/) /g,'1'),2)))});" 呈现“真实”页面。
2021-03-21 22:35:08
@MarceloRodovalho 我用 ctrl+s 保存了整个页面!
2021-03-23 22:35:08
@Mironline - 是的,我用 ctrl+s 试过了。好像保存了“samypl”的页面和所有的源js和css,虽然需要多一点解密。对于试图保护您的代码,这似乎是一个了不起的方法,但对于那些希望探索这一点的人来说,这并不是充分的证据。
2021-04-11 22:35:08