Comment puis-je masquer ou chiffrer le code JavaScript?

Existe-t-il un moyen de masquer ou de chiffrer le code JavaScript pour empêcher les gens de visionner, copier ou modifier des programmes propriétaires?

    Vous pouvez l'obscurcir, mais il n'y a aucun moyen de le protéger complètement.

    Exemple obscurcisseur: http://www.javascriptobfuscator.com/Default.aspx

    Non, ce n'est pas possible. Si elle fonctionne sur le navigateur client, elle doit être téléchargée par le navigateur client. Il est assez banal d'utiliser Fiddler pour inspecter la session HTTP et obtenir tous les fichiers js téléchargés.

    Il existe des astuces que vous pouvez utiliser. L'un des plus évidents est d'utiliser un obscès JavaScript.

    Ensuite, l'obfuscation n'empêche que les snoopings occasionnels et n'empêche pas les gens de soulever et d'utiliser votre code.

    Vous pouvez essayer le script d'action compilé sous la forme d'un film flash.

    Bien que tout le monde accepte généralement que le cryptage Javascript est une mauvaise idée , il existe quelques cas d'utilisation faible où ralentir l'attaque est mieux que rien. Vous pouvez commencer par YUI Compressor (comme @Ben Alpert) dit, ou JSMin, Uglify, ou beaucoup plus.

    Cependant, le cas principal dans lequel je veux vraiment "cacher des choses" est quand je publie une adresse e-mail. Notez qu'il y a le problème de Chrome lorsque vous cliquez sur 'inspecter l'élément'. Il montrera votre code original: à chaque fois. C'est pourquoi l'obfuscation est généralement considérée comme un meilleur moyen d'y aller.

    Sur cette note, je prends une double attaque, simplement pour ralentir les robots spam. I Obfuscate / minify the js, puis exécutez-le à nouveau à travers un codeur (encore une fois, cette deuxième étape est complètement inutile en chrome).

    Même si ce n'est pas exactement un codeur Javascript pur, le meilleur codeur html que j'ai trouvé est http://hivelogic.com/enkoder/ . Cela va transformer ceci:

    <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> 

    Dans ceci:

     <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> 

    Peut-être que c'est assez pour ralentir quelques robots de spam. Je n'ai pas eu de spam en utilisant ce (! Encore).

    L'un des meilleurs compresseurs (pas spécifiquement un obscurcissant) est le compresseur YUI .

    Si vous avez quelque chose en particulier que vous souhaitez cacher (comme un algorithme propriétaire), mettez-le sur le serveur, ou mettez-le dans un film Flash et appelez-le avec JavaScript. L'écriture d'ActionScript est très similaire à l'écriture de JavaScript, et vous pouvez communiquer entre JavaScript et ActionScript. Vous pouvez faire de même avec Silverlight, mais Silverlight n'a pas la pénétration de Flash.

    Cependant, n'oubliez pas que tous les téléphones mobiles peuvent exécuter votre JavaScript, mais pas Silverlight ou Flash, afin que vous éloigniez vos utilisateurs mobiles si vous utilisez Flash ou Silverlight.

    La seule façon sûre de protéger votre code ne l'abandonne pas. Avec le déploiement du client, il n'y a pas d'évitement que le client ait accès au code.

    La réponse courte est donc: vous ne pouvez pas le faire

    La réponse plus longue envisage le flash ou Silverlight. Bien que je crois que Silverlight sera heureux de donner ses secrets avec un réflecteur sur le client.

    Je ne sais pas si quelque chose de simular existe avec la plate-forme flash.

    JavaScript est un langage de script et reste donc en forme lisible par l'utilisateur jusqu'à ce qu'il soit temps qu'il soit interprété et exécuté par l'exécution JavaScript.

    La seule façon de le cacher partiellement, du moins des esprits moins techniques, est d'obscurcir.

    L'obfuscation rend plus difficile pour les humains de le lire, mais pas impossible pour les techniciens.

    Je sais que c'est un fil ancien, mais j'aimerais simplement ajouter une méthode pour cacher vos scripts, même si je pourrais le rendre un peu plus difficile à voir. La clé est d'utiliser AJAX et de l'exécuter complètement en synchronisation avec vos scripts côté serveur comme Php. De cette façon, l'algorithme complet n'est pas totalement exposé et n'aurait aucun sens pour quiconque veut voler vos codes. Bien sûr, ce n'est pas une solution 100% infaillible puisque vos scripts côté client seraient et pourraient encore être exposés si vous appuyez sur F12 dans chrome par exemple. En outre, si vos scripts java s'appuient sur beaucoup de processus côté serveur, il n'y aurait absolument rien à craindre du tout.

    Dans ce script, les contenus véritables – vos scripts du côté client actuel – ne sont récupérés que via la méthode get (ps: vous pouvez toujours voir le contenu en suivant l'URL – pour éviter cela, utilisez la méthode 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> 

    Encore une fois, ce n'est pas une méthode infaillible. Tout le monde peut dépasser totalement le script préchargé tant qu'il déclenche une méthode get avant. J'ai utilisé des sessions PHP pour limiter l'accès; Cela peut encore être amélioré.

    Honnêtement cependant, ce n'est qu'une charge supplémentaire de processus. Mais cela n'empêche personne d'essayer, n'est-ce pas?

    PS: Pardonnez-moi si mes codes et l'utilisation de terminologies sont un peu rudimentaires. Je n'ai fait que Php pendant un an au moment de l'écriture.

    Méthode 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($_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>