如何隐藏或encryptionJavaScript代码?
有什么方法可以隐藏或encryptionJavaScript代码,以防止人们查看,复制和/或修改专有程序?
你可以混淆它,但是没有办法完全保护它。
示例混淆器: http : //www.javascriptobfuscator.com/Default.aspx
不,这是不可能的。 如果它运行在客户端浏览器上,则必须由客户端浏览器下载。 使用Fiddler检查HTTP会话并获取任何下载的js文件是非常简单的。
有一些技巧可以使用。 其中最明显的是使用JavaScript混淆器。
再一次,混淆只能防止偶然的窥探,并不会阻止人们解除和使用你的代码。
您可以尝试以Flash电影的forms编译的动作脚本。
虽然每个人都会同意Javascriptencryption是一个坏主意 ,但是有一些小的用例,减缓攻击比没有好。 你可以从YUI Compressor (如@Ben Alpert)开始说,或者JSMin,Uglify,或者更多。
但是,我想真正“隐藏东西”的主要情况是当我发布一个电子邮件地址。 请注意,点击“检查元素”时出现Chrome问题。 它会显示您的原始代码:每次。 这就是为什么混淆通常被认为是更好的方法。
在这个说明中,我采取了双pipe齐下的攻击,纯粹是为了减缓垃圾邮件机器人。 I混淆/缩小js,然后通过编码器再次运行(同样,这个第二步在chrome中是完全没有意义的)。
虽然不完全是一个纯粹的Javascript编码器,我发现最好的html编码器是http://hivelogic.com/enkoder/ 。 它会变成这样:
<script type="text/javascript"> //<![CDATA[ <!-- var c=function(e) { var m="mail" + "to:webmaster";var a="somedomain"; e.href = m+"@"+a+".com"; }; //--> //]]> </script> <a href="#" onclick="return c(this);"><img src="images/email.png" /></a>
进入这个:
<script type="text/javascript"> //<![CDATA[ <!-- var x="function f(x){var i,o=\"\",ol=x.length,l=ol;while(x.charCodeAt(l/13)!" + "=50){try{x+=x;l+=l;}catch(e){}}for(i=l-1;i>=0;i--){o+=x.charAt(i);}return o" + ".substr(0,ol);}f(\")87,\\\"meozp?410\\\\=220\\\\s-dvwggd130\\\\#-2o,V_PY420" + "\\\\I\\\\\\\\_V[\\\\\\\\620\\\\o710\\\\RB\\\\\\\\610\\\\JAB620\\\\720\\\\n\\"+ "\\{530\\\\410\\\\WJJU010\\\\|>snnn|j5J(771\\\\p{}saa-.W)+T:``vk\\\"\\\\`<02" + "0\\\\!610\\\\'Dr\\\\010\\\\630\\\\400\\\\620\\\\700\\\\\\\\\\\\N730\\\\,530" + "\\\\2S16EF600\\\\;420\\\\9ZNONO1200\\\\/000\\\\`'7400\\\\%n\\\\!010\\\\hpr\\"+ "\\= -cn720\\\\a(ce230\\\\500\\\\f730\\\\i,`200\\\\630\\\\[YIR720\\\\]720\\\\"+ "r\\\\720\\\\h][P]@JHADY310\\\\t230\\\\G500\\\\VBT230\\\\200\\\\Clxhh{tzra/{" + "g0M0$./Pgche%Z8i#p`v^600\\\\\\\\\\\\R730\\\\Q620\\\\030\\\\730\\\\100\\\\72" + "0\\\\530\\\\700\\\\720\\\\M410\\\\N730\\\\r\\\\530\\\\400\\\\4420\\\\8OM771" + "\\\\`4400\\\\$010\\\\t\\\\120\\\\230\\\\r\\\\610\\\\310\\\\530\\\\e~o120\\\\"+ "RfJjn\\\\020\\\\lZ\\\\\\\\CZEWCV771\\\\v5lnqf2R1ox771\\\\p\\\"\\\\tr\\\\220" + "\\\\310\\\\420\\\\600\\\\OSG300\\\\700\\\\410\\\\320\\\\410\\\\120\\\\620\\" + "\\q)5<: 0>+\\\"(f};o nruter};))++y(^)i(tAedoCrahc.x(edoCrahCmorf.gnirtS=+o;" + "721=%y;++y)87<i(fi{)++i;l<i;0=i(rof;htgnel.x=l,\\\"\\\"=o,i rav{)y,x(f noit" + "cnuf\")" ; while(x=eval(x)); //--> //]]> </script>
也许这足以减缓一些垃圾邮件机器人的速度。 我没有任何垃圾邮件通过使用(!)。
YUI压缩机是最好的压缩机之一(不是特别的混淆器)。
如果你有什么特别的要隐藏的东西(比如专有algorithm),把它放在服务器上,或者把它放到Flash电影中,用JavaScript调用它。 编写ActionScript与编写JavaScript非常相似,您可以在JavaScript和ActionScript之间进行通信。 你可以用Silverlight做同样的事,但是Silverlight没有Flash的渗透。
不过,请记住,任何手机都可以运行JavaScript,但不能运行Silverlight或Flash,所以如果您使用Flash或Silverlight,则会使您的移动用户瘫痪。
保护你的代码的唯一安全的方法是不会泄露的。 使用客户端部署,不会避免客户端访问代码。
所以简短的答案是:你做不到
更长的答案是考虑闪光灯或Silverlight。 虽然我相信silverlight会很乐意放弃客户端运行的reflection器的秘密。
我不确定Flash平台是否存在类似的情况。
JavaScript是一种脚本语言,因此在JavaScript运行时解释和执行它之前,它一直处于人们可读的forms。
部分隐藏它的唯一方法就是混淆,至less从技术含量较低的人来看。
混淆使得人们难以阅读,但技术上的精明并不是不可能的。
我知道这是一个古老的线程,但我只是想添加一个隐藏脚本的方法,如果只是使它更难以查看。 关键是要使用AJAX,并使其完全与您的服务器端脚本(如Php)同步运行。 这样,整个algorithm并没有完全暴露,对于任何想窃取你的代码的人来说都是毫无意义的。 当然,这不是一个100%的万无一失的解决scheme,因为如果您在Chrome中按F12键,您的客户端脚本将仍然可以被暴露。 另外,如果你的java脚本依赖于很多的服务器端进程,那么根本就不用担心。
在这个脚本中,真正的内容 – 实际的客户端脚本 – 只能通过get方法来获取(ps:你仍然可以通过下面的url看到内容 – 为了避免这种情况,使用post方法):
<?Php //THE FOLLOWING VARIABLE IS ADDED TO ENABLE TOGGLING OF THIS FUNCTIONALITY: $obscureScripts = TRUE; //IF OBSCURE SCRIPT FUNCTIONALITY IS ALLOWED, //THE SYSTEM SHOULD ONLY ALLOW REQUESTS TRIGGERED BY SPECIFIED GET METHOD //OTHER THAN THAT, OR UNLESS $_GET['fetch'] == 'content', PERFORM THE FOLLOWING SCRIPTS: if ($obscureScripts && !(isset($_GET['fetch']) && $_GET['fetch'] == 'content')) { //OPEN A SESSION session_start(); //CREATE AN INDICATOR THAT THIS METHOD HAS BEEN USED $_SESSION['obscr'] = 'set'; //CLOSE SESSION WRITER session_write_close(); //ECHO THE FAKE CONTENTS OF YOUR PAGE echo "<script type='text/javascript' src='plugins/jquery-1.9.0.min.js'></script> \n". "<script> \n". "$.get \n". "( '?fetch=content', \n". " function(data) \n". " { $('body').fadeOut \n". " ( function() \n". " { $(this).empty().html(data).fadeIn(100); \n". " } \n". " ); \n". " } \n". "); \n". "</script> \n". "<html><head><title>Page Front</title><link rel='icon' href='icon.ico'/></head> \n". "<body bgcolor='#121212'><center>Loading...</center></body></html> \n"; //THE FAKE CONTENTS WOULD IN TURN RUN A JQUERY SCRIPT TO RETRIEVE THE ACTUAL PAGE CONTENT //DO NOT RUN THE REST OF THE SCRIPT/PAGE exit(); } //IF OBSCURE SCRIPT FUNCTIONALITY IS ON, AND IF A FETCH REQUEST WAS MADE, //PERFORM THE FOLLOWING VALIDATION else if ($obscureScripts && isset($_GET['fetch']) && $_GET['fetch'] == 'content') { //ATTEMPT TO RETRIEVE EXISTING SESSION session_start(); //CHECK IF A SESSION WAS SET: THIS IS TO INDICATE THE LOADING OF FAKE CONTENTS AND THAT //THE REAL CONTENTS ARE ONLY LOADED ONCE - BY THE JQUERY SCRIPTS PREVIOUSLY LOADED if (isset($_SESSION['obscr']) && $_SESSION['obscr'] == 'set') { //ONCE CONFIRMED, UNSET THE SESSION TO PREVENT ANOTHER REQUEST unset($_SESSION['obscr']); //IF THE SESSION BECAME EMPTY AFTER UNSETTING THE 'obscr' SESSION VARIABLE, //DELETE THE SESSION if (empty($_SESSION)) { session_unset(); session_destroy(); } //CLOSE THE SESSION WRITER AND PROCEED TO THE REST OF THE CONTENTS session_write_close(); //NOTICE THAT THERE'S NOT exit() OR die() REQUEST HERE. //THIS MEANS THAT THE SCRIPT WOULD PROCEED TO THE CONTENTS } //IF NO SESSION IS SET, THIS MEANS THAT THE GET METHOD IS PROBABLY BEING REQUESTED //FOR THE SECOND TIME; PROBABLY NOT BY THE PRE-LOADED SCRIPTS //IF SO, PERFORM THE FOLLOWING: else { //CLOSE THE SESSION WRITER session_write_close(); //RELOAD THE PAGE BY REDIRECTING TO SELF header('Location: '.$_SERVER['PHP_SELF']); //PREVENT SHOWING ANYTHING AFTER THIS CODE exit(); } } ?> <html> <head><title>The content you want to hide</title></head> <body>Your precious content.</body> </html>
再次,这不是一个傻瓜的方法。 只要触发get方法,任何人都可以完全取代预加载的脚本。 我使用PHP会话来限制访问; 这仍然可以改善。
老实说,这只是一个额外的过程。 但是这并不能阻止任何人的尝试,对吧?
PS:如果我的代码和术语的使用有点不成熟,请原谅我。 在撰写本文的时候,我只做过一年的Php。
发布方法:
<?Php //THE FOLLOWING VARIABLE IS ADDED TO ENABLE TOGGLING OF THIS FUNCTIONALITY: $obscureScripts = TRUE; //IF OBSCURE SCRIPT FUNCTIONALITY IS ALLOWED, //THE SYSTEM SHOULD ONLY ALLOW REQUESTS TRIGGERED BY SPECIFIED GET METHOD //OTHER THAN THAT, OR UNLESS $_GET['fetch'] == 'content', PERFORM THE FOLLOWING SCRIPTS: if ($obscureScripts && !(isset($_POST['fetch']) && $_POST['fetch'] == 'content')) { //OPEN A SESSION session_start(); //CREATE AN INDICATOR THAT THIS METHOD HAS BEEN USED $_SESSION['obscr'] = 'set'; //CLOSE SESSION WRITER session_write_close(); //ECHO THE FAKE CONTENTS OF YOUR PAGE echo // USING HEREDOC THIS TIME <<<SCRIPT <script type='text/javascript' src='plugins/jquery-1.9.0.min.js'></script> <script> \$.post ( "{$_SERVER['PHP_SELF']}", { fetch:"content" } ).done ( function(data) { \$("body").empty().html(data); } ); </script> <html> <head> <title>Page Front</title> </head> <body> <center>Loading...</center> </body> </html> SCRIPT; //THE FAKE CONTENTS WOULD IN TURN RUN A JQUERY SCRIPT TO RETRIEVE THE ACTUAL PAGE CONTENT //DO NOT RUN THE REST OF THE SCRIPT/PAGE exit(); } //IF OBSCURE SCRIPT FUNCTIONALITY IS ON, AND IF A FETCH REQUEST WAS MADE, //PERFORM THE FOLLOWING VALIDATION else if ($obscureScripts && isset($_POST['fetch']) && $_POST['fetch'] == 'content') { //ATTEMPT TO RETRIEVE EXISTING SESSION session_start(); //CHECK IF A SESSION WAS SET: THIS IS TO INDICATE THE LOADING OF FAKE CONTENTS AND THAT //THE REAL CONTENTS ARE ONLY LOADED ONCE - BY THE JQUERY SCRIPTS PREVIOUSLY LOADED if (isset($_SESSION['obscr']) && $_SESSION['obscr'] == 'set') { //ONCE CONFIRMED, UNSET THE SESSION TO PREVENT ANOTHER REQUEST unset($_SESSION['obscr']); //IF THE SESSION BECAME EMPTY AFTER UNSETTING THE 'obscr' SESSION VARIABLE, //DELETE THE SESSION if (empty($_SESSION)) { session_unset(); session_destroy(); } //CLOSE THE SESSION WRITER AND PROCEED TO THE REST OF THE CONTENTS session_write_close(); //NOTICE THAT THERE'S NOT exit() OR die() REQUEST HERE. //THIS MEANS THAT THE SCRIPT WOULD PROCEED TO THE CONTENTS } //IF NO SESSION IS SET, THIS MEANS THAT THE GET METHOD IS PROBABLY BEING REQUESTED //FOR THE SECOND TIME; PROBABLY NOT BY THE PRE-LOADED SCRIPTS //IF SO, PERFORM THE FOLLOWING: else { //CLOSE THE SESSION WRITER session_write_close(); //RELOAD THE PAGE BY REDIRECTING TO SELF header('Location: '.$_SERVER['PHP_SELF']); //PREVENT SHOWING ANYTHING AFTER THIS CODE exit(); } } ?> <html> <head><title>The content you want to hide</title></head> <body>Your precious content.</body> </html>