2009-06-19 26 views
44

Esiste un modo per nascondere o crittografare il codice JavaScript per impedire agli utenti di visualizzare, copiare e/o modificare i programmi proprietari?Come posso nascondere o crittografare il codice JavaScript?

+0

Prova questo link: http://stackoverflow.com/questions/6869312/how-do-i-hide-javascript-code-in-a-webpage/13262948 # 13262948 -Jepp – Jepp

risposta

63

Puoi offuscarlo, ma non c'è modo di proteggerlo completamente.

esempio obfuscator: http://www.javascriptobfuscator.com/Default.aspx

+0

Come offuscarlo, qualsiasi libreria lì? Grazie! –

+0

una libreria php sarebbe davvero bella – mgutt

+0

Funziona bene e non restituisce errori per impostazione predefinita. Grazie! – dvd

6

No, non è possibile. Se viene eseguito sul browser client, deve essere scaricato dal browser client. È piuttosto banale usare Fiddler per ispezionare la sessione HTTP e ottenere tutti i file js scaricati.

Ci sono trucchi che è possibile utilizzare. Uno dei più ovvi è quello di impiegare un objuger javascript.

Quindi, di nuovo, l'offuscamento impedisce solo il furto casuale e non impedisce alle persone di sollevare e utilizzare il codice.

È possibile provare lo script di azione compilato sotto forma di filmato flash.

5

Uno dei migliori compressori (non specificamente un offuscatore) è lo YUI Compressor.

2

L'unico modo sicuro per proteggere il codice non è quello di darlo via. Con la distribuzione client, non è possibile evitare che il client abbia accesso al codice.

Quindi la risposta breve è: non è possibile farlo

La risposta è più considerato Flash o Silverlight. Sebbene io creda che Silverlight darà volentieri i suoi segreti con il riflettore che gira sul client.

Non sono sicuro che esista qualcosa di simile con la piattaforma flash.

2

JavaScript è un linguaggio di scripting e pertanto rimane in forma leggibile dall'uomo finché non è giunto il momento di essere interpretato ed eseguito dal runtime JavaScript.

L'unico modo per nascondere parzialmente, almeno dalla mente meno tecniche, è per nascondere.

L'offuscamento rende più difficile per gli umani leggerlo, ma non impossibile per il tecnico esperto.

3

Se hai qualcosa in particolare che si desidera nascondere (come un algoritmo proprietario), che mettere sul server, o metterlo in un filmato Flash e chiamarlo con JavaScript. La scrittura di ActionScript è molto simile alla scrittura di JavaScript e puoi comunicare tra JavaScript e ActionScript. Puoi fare lo stesso con Silverlight, ma Silverlight non ha la penetrazione di Flash.

Tuttavia, ricorda che il telefono cellulare in grado di eseguire il JavaScript, ma non Silverlight o Flash, in modo che stai paralizzando gli utenti di telefonia mobile se si va con Flash o Silverlight.

6

Mentre tutti concordano sul fatto che la crittografia Javascript è un bad idea, ci sono alcuni piccoli casi d'uso in cui rallentare l'attacco è meglio di niente. Puoi iniziare con YUI Compressor (come @Ben Alpert) detto, o JSMin, Uglify o molti altri.

Tuttavia, il caso principale in cui voglio davvero "nascondere le cose" è quando sto pubblicando un indirizzo email. Nota, c'è il problema di Chrome quando fai clic su 'inspect element'. Mostrerà il tuo codice originale: ogni volta.Questo è il motivo per cui l'offuscamento è generalmente considerato come un modo migliore per andare.

Su quella nota, prendo un attacco a due punte, puramente per rallentare i bot spam. I Obfuscate/minify il js e poi lo eseguo di nuovo attraverso un codificatore (anche in questo caso, questo secondo passaggio è completamente inutile in chrome).

Sebbene non sia esattamente un codificatore JavaScript puro, il miglior codificatore html che ho trovato è http://hivelogic.com/enkoder/. Sarà trasformare questo:

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

in questo:

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

Forse è sufficiente per rallentare alcuni bots spam. Non ho mai ricevuto spam usando questo (! Ancora).

0

So che questo è un thread vecchio, ma vorrei solo aggiungere un metodo per nascondere gli script, anche solo per renderlo un po 'più difficile da visualizzare. La chiave è usare AJAX e farlo funzionare in totale sincronia con gli script sul lato server come Php. In questo modo, l'intero algoritmo non è completamente esposto e sarebbe totalmente privo di significato per chiunque voglia rubare i tuoi codici. Ovviamente non è una soluzione infallibile al 100%, dal momento che i tuoi script sul lato client potrebbero essere ancora esposti se si colpisce F12 in chrome, ad esempio. Inoltre, se i tuoi script java si affidano a un sacco di processi sul lato server, in primo luogo non ci sarebbe assolutamente bisogno di preoccuparsi.

In questo script, i veri contenuti - i vostri script lato client effettivi - vengono recuperati solo attraverso il metodo get (ps: è ancora possibile vedere i contenuti seguendo l'url - al fine di evitare che, utilizzare il metodo 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> 

Ancora, questo non è un metodo infallibile. Chiunque può superare totalmente lo script precaricato, purché inneschi un metodo get prima di esso. Ho usato sessioni PHP per limitare l'accesso; che può ancora essere migliorato.

Onestamente, questo è solo un ulteriore carico di processo. Ma questo non impedisce a nessuno di provarci, giusto?

PS: Perdonami se i miei codici e l'uso delle terminologie sono un po 'rudimentali. Ho fatto Php per un anno solo al momento della scrittura. Metodo

Messaggio:

<?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> 
Problemi correlati