web-dev-qa-db-fra.com

Comment masquer ou chiffrer le code JavaScript?

Existe-t-il un moyen de masquer ou de chiffrer le code JavaScript afin d'empêcher les utilisateurs de visualiser, de copier et/ou de modifier des programmes propriétaires?

52
jasonGreen

Vous pouvez le masquer, mais il n’ya aucun moyen de le protéger complètement.

exemple obfuscator: https://obfuscator.io

70
Sev

Bien que tout le monde convienne généralement que le cryptage Javascript est un mauvaise idée , il existe quelques cas d'utilisation modestes où ralentir l'attaque vaut mieux que rien. Vous pouvez commencer avec YUI Compressor (comme @Ben Alpert), ou JSMin, Uglify ou bien d’autres.

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

Sur cette note, je prends une attaque en deux volets, uniquement pour ralentir les robots de spam. J'obscurcir/minifier le js, puis l'exécuter à nouveau via un encodeur (encore une fois, cette deuxième étape est totalement inutile en chrome).

Bien que n'étant pas exactement un encodeur Javascript pur, le meilleur encodeur html que j'ai trouvé est http://hivelogic.com/enkoder/ . Cela va tourner 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 cela suffit pour ralentir quelques robots de spam. Je n'ai reçu aucun spam en utilisant ceci (! Encore).

6
cmroanirgo

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

Il y a des astuces que vous pouvez utiliser. L'une des plus évidentes consiste à utiliser un obfuscateur javascript.

Encore une fois, l’obscurcissement empêche seulement l’espionnage occasionnel et n’empêche pas les personnes de soulever et d’utiliser votre code.

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

6
Alan

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

5
Sophie Alpert

JavaScript est un langage de script et reste donc sous une forme lisible par l'homme jusqu'à ce qu'il soit temps qu'il soit interprété et exécuté par le moteur d'exécution JavaScript.

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

L'obscurcissement rend plus difficile la lecture par les humains, mais pas impossible pour les experts.

3
BakerTheHacker

Si vous souhaitez masquer quelque chose en particulier (comme un algorithme propriétaire), placez-le sur le serveur ou placez-le dans une animation 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 la même chose avec Silverlight, mais Silverlight n’a pas la même pénétration que Flash.

Cependant, rappelez-vous que tous les téléphones mobiles peuvent exécuter votre code JavaScript, mais pas Silverlight ou Flash, de sorte que vous paralyser vos utilisateurs mobiles si vous utilisez Flash ou Silverlight.

3
Nosredna

Le seul moyen sûr de protéger votre code est de ne pas le révéler. Avec le déploiement du client, il n’empêche pas le client d’avoir accès au code.

Donc, la réponse courte est: vous ne pouvez pas le faire

La réponse la plus longue envisage flash ou Silverlight. Bien que je pense que silverlight se fera un plaisir de révéler ses secrets avec un réflecteur tournant sur le client.

Je ne suis pas sûr que quelque chose de similaire existe avec la plate-forme flash.

2
Andrew Harry