2009-11-02 174 views
24

我知道它不可能100%的保护,但是对于大多数用户来说,这是很高的或者是有效的。如何防止您的JavaScript代码被盗,复制和查看?

例如,我遇到一个网站,查看当前页面的源代码没有任何返回。

在另一种情况下,访问或试图从浏览器

http://gget.com/somesecret.js下载.js文件本身,

会重定向你的东西。

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

+2

我不知道混淆的代码是否容易解码,但看看谷歌的JavaScript,并试图“偷”它:) – Aif 2009-11-02 08:45:01

+6

正如你所说,没有100%的保护。我会说任何足够成熟的人都可以用“被盗”的JS代码做任何有价值的事情,这也足够复杂,可以绕过任何可能用来隐藏脚本的手势。即,这是一个毫无意义的事业,恕我直言。 – deceze 2009-11-02 08:48:15

+0

另一个非常高度抽象的解决方案是将你的JavaScript与你的服务器端代码紧密结合起来,这样即使有人偷了你的JS,他们自己也可以使用它。 – 2009-11-02 17:15:51

回答

20

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

5

尤其在现代浏览器中,这是完全浪费时间。

我可以使用Firebug查看somesecret.js ...至于另一个我更好,如果你向下滚动,你会看到源代码。

你可以缩小或混淆你的代码,这将使它很难改变(但不是一个确切的副本)。建议使用缩小,因为这会导致页面加载速度稍快。

+0

如何缩小和混淆我的代码?有没有我可以使用的软件?是基于web的安全吗? 即时通知人们可以使用萤火虫和查看一切.... 但我想这样做很困难。它不会是完美的,但如果我能阻止大多数人,它会很好。 – wghwh 2009-11-02 08:48:16

+0

看看YUI Compressor,例如:http://developer.yahoo.com/yui/compressor/ – Jesper 2009-11-02 08:57:08

2

那么,如果你拥有服务器,你可以拒绝除你自己的主机名之外的引用者的访问。在Apache上,你可以通过.htaccess来完成。

您还可以使用Dean Edwards' packer打包您的制作Javascript代码。

但请注意,借助Firebug或其他调试工具,大多数人仍然能够通过DOM选项卡/检查器查看您的代码。

43

这根本不可能。

对于访问者的浏览器能够执行脚本,他们必须能够下载它。无论你尝试使用JS,服务器权限等等,在一天结束时他们可以总是只有wget http://example.com/yourcoolscript.js。即使他们不能(例如,你需要“秘密”的标题),这可能会抑制大多数浏览器的行为,而不会阻止一个确定的人看起来。

基本上,因为JS在客户端执行,所以客户端必须能够访问“原始”JS文件。

你可以做的一件小事是混淆,它可以帮助一点点。但是由于JS被解释,它也是它自己的解混器 - 例如one of my earlier answers

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

+6

可以在浏览器和服务器之间放置一些TCP/IP侦听器,通过它可以看到HTML和JavaScript这是他们之间的沟通。所以“秘密标题”并不是什么好事。 – Jesper 2009-11-02 08:56:14

+0

@Jesper这样的听众已经存在并且易于使用。设置缓存Web代理(如squid)或http流量嗅探器(如fiddler),您就可以开始使用了。 – Wedge 2009-11-02 09:01:29

+0

Jesper - 我同意,这就是我所说的“不阻止一个有决心的人看”的意思。浏览器必须能够在正常操作中看到该文件,并且任何人都可以像浏览器一样充分表现出自己的文件。 – 2011-08-19 09:16:51

5

不要浪费你的时间。如果浏览器可以下载它来运行它(并且它可以,否则代码是无用的),可以编写一个程序来下载并保存它。

一次又一次,我们已经看到,保护这种事情的技术方法不起作用。

你真的认为你的JS代码非常宝贵,它需要这种保护?一旦你得到它的工作,通过一切手段,只要加快下载过程,通过缩小器运行。但是为了保护它,我会专注于你最擅长的事情(我假设它正在编码它)。

如果您确实需要保护代码不被查看,请不要在客户端JS中执行此操作。把它放在服务器上,然后使用JS与之通信。

30

有两种用户:有一大群人不在乎。没有必要保护他们。

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

创造一个伟大的产品,并提供良好的支持,人们愿意为此付出代价。过去,城堡建筑并不能很好地工作(很多努力,只需要几块石头就可以把它们撕下来),而且今天肯定不行。

如果您担心自己的想法会被盗用,那么您应该找一份新工作,因为他们会做,而且您没有办法做。

15

如果您有很大的秘密,请将它们放在服务器上。

然后将所有的JS文件捆绑到一个文件中,以便混淆。
这应该会阻止很多人走得更远,并且还会减小大小和http呼叫。
但是这不会阻止真正的坏人,如果有的话。

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

由于没有任何东西可以得到保护,为什么不开放源代码有用的部分,并得到其他人的反馈?
试试吧,您不会感到失望。

6

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

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

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

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

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

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

原始代码:从两个b

alert("Hello, JavaScript") 

输出美化网站:

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

希望能够启发那些需要的人!

+0

我不能只在eval附近放置一个断点,检查它正在尝试处理的变量的值并获取Javascript?我认为这是相当微不足道的...... – David 2014-03-18 14:04:23

+1

我只是在评估之前修补eval以输出代码 – Guillaume86 2014-05-15 10:21:51

+0

是的,但是您可以使用随机代码混淆器来生成输出源。然后,每当同一个请求被执行时,就会输出一个不同的代码。有些混淆器,您可以使用解密密钥在eval函数中使用。 并非不可能。但非常困难。 – 2015-01-05 18:03:31

0

如果有人确实用钢代码你可以起诉他们。您的代码受版权保护。你就像小说的作者。如果有人偷了你的应用程序或你的代码的任何部分,他们会犯剽窃。

+3

“美国之路”... – David 2014-03-18 14:05:09

+1

不可能,如果你在印度:) – Subhajit 2016-01-12 06:12:38

+1

它提醒我thepiratebay的故事:)如果警察无法得到他们,我不知道他们会投入多少钱来捕捉一些“重要的”网站脚本。 – 2016-04-22 05:56:33

0

你可以做的一件事就是完全规避JavaScript - 用同样或更主要的语言编写客户端逻辑(为此可以找到一个JavaScript编译器)并最终将其编译为JavaScript。 (这可能使代码混淆得太好)