Come posso offuscare (proteggere) JavaScript? [chiuso]


714

Voglio creare un'applicazione JavaScript che non sia open source, e quindi desidero imparare come offuscare il mio codice JS? È possibile?


15
Sarei interessato a sentire il motivo per cui stai cercando di offuscare il codice, potrebbe dare un contesto necessario per dare una risposta utile.
JohnFx,

45
L'unico modo per mantenere veramente segreto qualcosa è non inviarlo al client . Se non ce l'hanno, non possono leggerlo. Inviarlo crittografato è solo chiedere guai alle poche persone a cui effettivamente importa, e tutti gli altri non curioseranno anche se lo invii in chiaro (vedi DRM).
Donal Fellows,


8
Offuscare il tuo codice non è una buona idea. Disonesterà solo gli utenti legittimi (ad es. Quando devono correggere un bug) e non farà nulla per "proteggerlo" da persone che hanno un incentivo (finanziario) per decodificarlo. È fondamentalmente impossibile prevenire il reverse engineering del codice Javascript.
Sven Slootweg,

14
L'argomento da non offuscare mi sembra imperfetto. A meno che tu non pensi davvero che i tuoi utenti possano correggere / segnalare bug, allora dovresti farlo. Può ridurre i tempi di caricamento minimizzando. Non fermerà mai un hacker veramente dedicato, ma lo rallenterà e fermerà i tentativi di hacking a metà corsa. È molto facile da fare e ci sono molti strumenti (vedi altre risposte), direi certamente di farlo poiché ci sono solo vantaggi il più delle volte, ma non aspettarti che porti sicurezza reale o impedisca a qualcuno di copiare il tuo codice se vogliono davvero. L'unico modo per farlo è mantenere il lato server del codice e usare ajax.
Benjamin,

Risposte:


405

Offuscazione:

Prova YUI Compressor . È uno strumento molto popolare, creato, migliorato e gestito dal team dell'interfaccia utente di Yahoo.

Puoi anche usare:

AGGIORNAMENTO: Questa domanda è stata originariamente posta più di 10 anni fa e YUI non è più mantenuta. Il compilatore di chiusura di Google è ancora in uso e UglifyJS può essere eseguito localmente tramite il gestore pacchetti nodo:npm install -g uglify-js

Dati stringa privati:

Mantenere privati ​​i valori delle stringhe è una preoccupazione diversa e l'offuscamento non sarà davvero di grande beneficio. Naturalmente, confezionando la tua fonte in un pasticcio confuso e minimizzato, hai una versione leggera della sicurezza attraverso l' oscurità . Il più delle volte, è il tuo utente che sta visualizzando l'origine e i valori di stringa sul client sono destinati al loro utilizzo, quindi spesso non è necessario un tipo di valore di stringa privato.

Se avessi davvero un valore che non avresti mai voluto che un utente vedesse, avresti un paio di opzioni. Innanzitutto, è possibile eseguire una sorta di crittografia, che viene decrittografata al caricamento della pagina. Questa sarebbe probabilmente una delle opzioni più sicure, ma anche un sacco di lavoro che potrebbe non essere necessario. Probabilmente potresti base64 codificare alcuni valori di stringa, e questo sarebbe più facile .. ma qualcuno che voleva davvero quei valori di stringa poteva facilmente decodificarli . La crittografia è l'unico modo per impedire veramente a chiunque di accedere ai tuoi dati e la maggior parte delle persone ritiene che sia più sicurezza del necessario.

Nota a margine:

L'offuscamento in Javascript è noto per causare alcuni bug. Gli offuscatori stanno migliorando un po ', ma molti abiti decidono di vedere abbastanza benefici dalla minimizzazione e dalla compressione , e i risparmi aggiuntivi di offuscamento non valgono sempre la pena . Se stai cercando di proteggere la tua fonte, forse deciderai che vale la pena, solo per rendere il tuo codice più difficile da leggere. JSMin è una buona alternativa.


32
Voglio aggiungere che fare una codifica base64 non gioverà alla sicurezza, poiché è una procedura banalmente reversibile. Anche la crittografia non aiuterà se è decifrata sul lato client. L'unico modo per garantire la sicurezza di una stringa è fare in modo che il client veda SOLO la stringa crittografata e venga passata a
Claudiu,

16
il server per ulteriori elaborazioni.
Claudiu,

9
Cordiali saluti, il compressore YUI on-line possono essere trovate qui: refresh-sf.com/yui
mtness

7
La crittografia dei valori di stringa avrà solo un vantaggio marginalmente maggiore rispetto alla codifica base64, se devono essere decifrati dal browser per usarli. Il motivo è che dovrai fornire al browser anche la chiave di crittografia e tutto ciò che il browser può fare anche l'utente può farlo.
Ben

9
Quando eseguo la mia minificazione con YUI Compressor, mi assicuro che usi metodi di minificazione "sicuri", ovvero che mantenga i punti e virgola --preserve-semi. La riscrittura delle variabili private in a, b, c etc è generalmente sicura. Un'altra cosa che faccio è fare in modo che il minificatore inserisca un'interruzione di riga dopo ogni punto e virgola nel codice --line-break 0. Quindi in produzione, se si verifica un errore, ho almeno una linea di riferimento valida su cui lavorare e posso trovare quel codice nella mia copia di sviluppo. Altrimenti ti ritrovi con un errore su una massiccia riga di codice e non hai idea di dove sia l'errore.
Zuallauz,

136

Sono sorpreso che nessuno abbia menzionato il Closure Compiler di Google . Non si limita a minimizzare / comprimere, analizza per trovare e rimuovere il codice inutilizzato e riscrive per la massima minimizzazione. Può anche eseguire il controllo del tipo e avviserà degli errori di sintassi.

Di recente JQuery è passato dal compressore YUI al compilatore di chiusura e ha riscontrato un " solido miglioramento "


60
sì, ma recentemente hanno lasciato il compilatore Closure e stanno usando UglifyJS ora. Il codice JQuery era difettoso dopo la compressione con il compilatore di chiusura
Chielus

Vorrei sottolineare che, se stai lavorando con angolare. questo strumento non funzionerà davvero a causa dell'iniezione di dipendenza e della ridenominazione degli argomenti, a meno che non sia presente una casella di controllo che non riesco a vedere.
iConnor

1
Strumento utile, ma non offusca ed è probabilmente il motivo per cui nessun altro lo aveva menzionato.
Madbreaks

1
@Madbreaks con ottimizzazioni avanzate ( developers.google.com/closure/compiler/docs/api-tutorial3 ) minimizzerà il codice fino al punto di offuscamento. Le variabili possono essere rinominate per brevità, ad esempio.
Jason Hall,

Anche Google non è un'opzione per la sicurezza
Fillipo Sniper,

121

L'offuscamento non può mai funzionare davvero. Per chi vuole davvero ottenere il tuo codice, è solo un dosso. Peggio ancora, impedisce ai tuoi utenti di correggere i bug (e di rispedirti le correzioni) e rende più difficile la diagnosi dei problemi sul campo. È una perdita di tempo e denaro.

Parla con un avvocato della legge sulla proprietà intellettuale e quali sono le tue opzioni legali. "Open source" non significa "le persone possono leggere la fonte". Invece, Open Source è un particolare modello di licenza che concede l'autorizzazione per utilizzare e modificare liberamente il codice. Se non concedi tale licenza, le persone che copiano il tuo codice sono in violazione e (nella maggior parte del mondo) hai opzioni legali per fermarli.

L'unico modo in cui puoi davvero proteggere il tuo codice è non spedirlo. Sposta l'importante codice lato server e chiedi al tuo codice Javascript pubblico di effettuare chiamate Ajax.

Vedi la mia risposta completa sugli offuscatori qui.


14
+1 sull'Avvocato, ma potrebbe non funzionare in altri paesi / giurisdizioni.
jmort253,

16
Gli avvocati probabilmente creano più costi / problemi rispetto al codice perso, pensano molto attentamente e organizzano un sacco di soldi per coinvolgere gli avvocati !!
andora

11
-1: Credo che trovare un avvocato che capisca JavaScript sarebbe difficile ... Per non parlare delle tasse e della quantità di tempo necessaria per trovare i "trasgressori". Qualcuno può davvero violare una licenza che è sepolta nei file HTML / JavaScript se non ha mai firmato nulla? +1 per le chiamate AJAX.
Alerty,

12
@Alerty 1) Le licenze fondamentalmente riguardano la concessione dell'uso di materiale protetto da copyright. Hai poco diritto di usarlo senza la licenza. Non è necessario firmarlo per ottenere i diritti. Una licenza è diversa da un contratto. 2a) Poiché la domanda riguarda le persone che copiano e utilizzano HTML / Javascript senza autorizzazione, la licenza non è "sepolta", è proprio lì sulla cosa presa. 2b) Hai poco diritto di utilizzare il materiale protetto da copyright di qualcun altro senza una licenza. 3) L'avvocato non ha bisogno di capire Javascript, solo la legge sulla proprietà intellettuale.
Schwern,

4
@Alerty Non essere ottuso. Si tratta di punire coloro che copiano il file per l'uso sul proprio sito senza autorizzazione. Quello di cui stai parlando è un contratto, non una licenza. I contratti richiedono un mutuo consenso e sono un dare e avere. Le licenze ti concedono il diritto di utilizzare la proprietà intellettuale. Le licenze sono a senso unico (il proprietario ti concede le cose), non sei obbligato a firmare perché non stai regalando nulla. Molti "Accordi di licenza software" sono in realtà contratti perché vanno oltre la licenza della proprietà e in cose a volte ridicole come il diritto di fare causa.
Schwern,

49

Puoi offuscare la fonte javascript tutto quello che vuoi, ma sarà sempre retroingegnerizzabile solo in virtù della richiesta di tutto il codice sorgente per essere effettivamente eseguito sul computer client ... la migliore opzione che mi viene in mente è di fare tutta la tua elaborazione con il codice lato server e tutto il codice client javascript fa è inviare richieste per l'elaborazione al server stesso. Altrimenti, chiunque sarà sempre in grado di tenere traccia di tutte le operazioni eseguite dal codice.

Qualcuno ha menzionato Base64 per mantenere le corde al sicuro. Questa è un'idea terribile. Base64 è immediatamente riconoscibile dai tipi di persone che vorrebbero decodificare il codice. La prima cosa che faranno è di decodificarlo e vedere di cosa si tratta.


45
Ovunque io vada, la risposta più comune a "come posso offuscare il mio Javascript?" è "non dovresti preoccupartene perché qualcuno potrebbe non offuscarlo". Questa non è davvero una risposta.
Travis Wilson,

2
@Vivek: un po 'in ritardo, ma quello che intendevo veramente è "codice lato server". È possibile eseguire javascript non in un browser, solo su un server, ma non so quanto sia comune.
Claudiu,

8
@Travis: non ho detto "non dovresti preoccuparti." Ho appena detto che se vuoi un programma a sorgente chiuso, non vorrai scriverlo in javascript sul lato client, perché qualsiasi offuscamento che fai non impedirà che venga (abbastanza facilmente) retroingegnerizzato.
Claudiu,

8
Giusto. Che non risponde in alcun modo "come posso offuscare il mio JavaScript". L'offuscamento non è un concetto astratto, è tecnico. L'op ha semplicemente chiesto "come?"
Madbreaks,

2
@Madbreaks: la domanda era nel contesto di non rendere il suo codice open source. La risposta tecnica immediata è quella accettata, ma la migliore risposta nel contesto (come in, cosa stai davvero cercando di fare?) È, IMO, che non puoi avere javascript sul lato client che non sia open source, perché tutti hanno la fonte, indipendentemente da come la offuschi. In entrambi i casi entrambe le risposte sono qui e le persone possono leggere e trarre beneficio da entrambi.
Claudiu,

45

Esistono numerosi strumenti di offuscamento JavaScript disponibili gratuitamente; tuttavia, penso sia importante notare che è difficile offuscare JavaScript al punto da non poter essere retroingegnerizzato.

A tal fine, ci sono diverse opzioni che ho usato in una certa misura negli straordinari:

  • Compressore YUI . Il compressore JavaScript di Yahoo! fa un buon lavoro di condensazione del codice che migliorerà il suo tempo di caricamento. C'è un piccolo livello di offuscamento che funziona relativamente bene. In sostanza, Compressor cambierà i nomi delle funzioni, rimuoverà gli spazi bianchi e modificherà le variabili locali. Questo è quello che uso più spesso. Questo è uno strumento open source basato su Java.

  • JSMin è uno strumento scritto da Douglas Crockford che cerca di minimizzare la tua fonte JavaScript. Con le stesse parole di Crockford, "JSMin non offusca, ma fa schifo". Il suo obiettivo principale è ridurre al minimo le dimensioni della fonte per un caricamento più rapido nei browser.

  • Obfuscator JavaScript gratuito . Questo è uno strumento basato sul Web che tenta di offuscare il codice codificandolo effettivamente. Penso che i compromessi della sua forma di codifica (o offuscamento) potrebbero venire a scapito della dimensione del file; tuttavia, è una questione di preferenze personali.


19
Poiché il codice Javascript deve essere eseguito sulla macchina del client, non è solo difficile offuscare al punto in cui il codice non può essere invertito, ma impossibile .
Schwern,

20
si tratta di statistiche. qual è la soglia a cui qualcuno accederà al tuo codice con offuscamento e senza? possono ancora avere accesso, ma più alta è la soglia, meno persone. meno persone conoscono qualcosa, più sicuro è qualcosa. pratica di classificazione di sicurezza standard.
Cris Stringfellow,

1
La ricerca / sostituzione @PeterR in un editor di testo renderà la tua vita molto più difficile provando a leggerlo o decodificarlo. non è perfetto, ma aggiunge un ulteriore livello di fastidio / difficoltà rimuovendo gli indizi di contesto. la maggior parte dei programmatori non è intelligente come te, ed è ciò che rende questo deterrente così eccezionale.
SED,

1
@SED Non conosco un singolo programmatore che non sia riuscito a trovare / sostituire un gruppo di [ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]variabili in almeno [var1, var2,..]un minuto. Posso letteralmente annullare la nitidezza, reindirizzare e cercare / sostituire i nomi var entro due minuti. E no, sono più intelligente di un Jr. Dev medio. Il fatto è che non c'è modo di oscurare JS lato client. Puoi comprarti 5 minuti, MAX, ma non serve a niente. Questa roba è in realtà solo per vendere qualcuno che non conosce il codice su "Sicurezza" aggiunta. Nessuno che abbia mai scritto una riga di JS comprerebbe quella merda.
Peter R,

3
@PeterR "Riesco letteralmente a svuotare, reindirizzare e cercare / sostituire i nomi var entro due minuti" - certo, vai avanti e provalo su un bundle di codebase minimizzato, offuscato, da 20 MB con una struttura che accetta settimane per capire anche con il codice sorgente originale e commentato. E per renderlo ancora più difficile, esistono strumenti di offuscamento che deliberatamente rompono il codice se cambiano rientro, righe, ecc.
John Weisz,

23

Cosa farei:

A. Troll l'hacker!

Questo sarà nella seconda parte il mio falso / offuscato codice javascript segreto LAUNCHER. Quello che vedi nel codice sorgente.

Cosa significa questo codice?

  1. carica il codice reale
  2. imposta un'intestazione personalizzata
  3. pubblica una variabile personalizzata

var ajax=function(a,b,d,c,e,f){
 e=new FormData();
 for(f in d){e.append(f,d[f]);};
 c=new XMLHttpRequest();
 c.open('POST',a);
 c.setRequestHeader("Troll1","lol");
 c.onload=b;
 c.send(e);
};
window.onload=function(){
 ajax('Troll.php',function(){
  (new Function(atob(this.response)))()
 },{'Troll2':'lol'});
}

B. Offuscare un po 'il codice

Cos'è quello?

  1. quello è lo stesso codice sopra in base64
  2. questo non è il codice javascript SEGRETO

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

C Crea un file php difficile da visualizzare con il codice reale all'interno

Cosa significa questo codice php?

  1. Verifica il referrer corretto (dominio / dir / codice del tuo launcher)
  2. Verifica l'intestazione personalizzata
  3. Verifica la variabile POST personalizzata

Se tutto è ok ti mostrerà il codice giusto altrimenti un codice falso o ban ip, chiudi pagina ... qualunque cosa.

<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
 echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
 echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>

base64 referrer = http://here.is/my/launcher.html

SECRET javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

FALSO = window.open('', '_self', '');window.close();

Ora .. se si definiscono gestori di eventi nel javascript SECRET è probabilmente accessibile .. è necessario definirli all'esterno con il codice di avvio e puntando a una funzione SECRET nidificata.

Quindi ... c'è un modo semplice per ottenere il codice? document.body.appendChild(document.createElement('div')).innerText='Awesome';

Non sono sicuro che funzioni, ma sto usando Chrome e ho selezionato Elementi, Risorse, Rete, Fonti, Linea temporale, Profili, Audit ma non ho trovato la riga sopra.

note1: se apri l'URL Troll.php da Inspect element-> network in chrome otterrai il codice falso.

note2: l'intero codice è scritto per i browser moderni. polyfill ha bisogno di molto più codice.

MODIFICARE

launcher.html

<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>

Troll.php

<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>

1
oh e sì vorrei anche offuscare il codice javascript.
cocco,

1
Questo è qualcosa a cui stavo solo pensando, trollando il cracker. Mi piacerebbe vedere qualcosa del genere senza dover usare PHP :)
pgarciacamou,

6
Anche se è divertente, uno sviluppatore web che è in grado di ispezionare correttamente il sito, può in qualche modo ottenere il codice sorgente. Penso davvero che non ci sia modo di nascondere alcun tipo di dati nel momento in cui li metti online.
cocco,

Penso che non sia alcun tipo di offuscamento. tuttavia sa come aprire la console, potrebbe anche conoscere la codifica / decodifica base64, molto semplice.
T.Todua,

19

Prova JScrambler . Di recente ho fatto un giro e ne sono rimasto colpito. Fornisce una serie di modelli per l'offuscamento con impostazioni predefinite per coloro che non si preoccupano molto dei dettagli e vogliono solo farlo rapidamente. Puoi anche creare offuscamenti personalizzati scegliendo le trasformazioni / tecniche che desideri.


7
L'abbonamento JScrambler è molto costoso ... L'abbonamento più economico richiede un prezzo minimo di 3 mesi $ 145 - è pazzesco.
Barbushin,

1
Ora hanno un piano gratuito. Gli altri piani di abbonamento sono ancora così cari.
user7610

2
Il piano gratuito include solo ottimizzazione e minimizzazione.
Jean Hominal,

1
"Il piano gratuito include ottimizzazione e minimizzazione", sì no. Offuscamento e ottimizzazione non vanno insieme, scusa.
NiCk Newman,

2
Guardando il sito Web di JScrambler oggi e più piani di prezzi non riesco a vedere un'opzione gratuita. Solo una prova gratuita ..
KDT

18

Il problema con i linguaggi interpretati è che invii il sorgente per farli funzionare (a meno che tu non abbia un compilatore in bytecode, ma poi, è piuttosto banale decompilare).

Quindi, se non vuoi sacrificare le prestazioni, puoi agire solo su nomi di variabili e funzioni, ad es. sostituendoli con a, b ... aa, ab ... o a101, a102, ecc. E, naturalmente, rimuovete quanto più spazio / newline possibile (è quello che fanno i cosiddetti compressori JS).
Le stringhe offuscanti avranno un impatto sulle prestazioni, se devi crittografarle e decrittografarle in tempo reale. Inoltre un debugger JS può mostrare i valori finali ...


17

Contrariamente alla maggior parte delle altre risposte che suggerisco contro YUI Compressor; dovresti usare Google Closure .

Non tanto perché comprime di più, ma soprattutto perché catturerà errori javascript come quelli a = [1,2,3,];che fanno andare IE in tilt.


5
non dovresti controllare il tuo codice contro errori e incompatibilità in entrambi i modi prima di offuscare ?? non ha nulla a che fare con l'offuscamento in realtà
phil294

13

Un'applicazione basata su Javascript non open source è abbastanza stupida. Javascript è un linguaggio interpretato dal lato client. L'offuscamento non è molto protettivo.

L'offuscamento di JS viene solitamente eseguito per ridurre le dimensioni dello script, anziché "proteggerlo". Se ti trovi in ​​una situazione in cui non vuoi che il tuo codice sia pubblico, Javascript non è la lingua giusta ..

Ci sono molti strumenti in giro, ma molti hanno la parola "compressore" (o "minificatore") nel suo nome per un motivo.


11

Non è possibile proteggere il codice lato client: basta premere F12 su Google Chrome, mettere in pausa l'esecuzione di JavaScript e otterrai tutte le stringhe, anche quelle crittografate. Abbelliscilo e rinomina le variabili e otterrai quasi il codice originale.

Se stai scrivendo javascript sul lato server (ad esempio NodeJS) ha paura che qualcuno hackeri il tuo server e desideri rendere più difficile il lavoro degli hacker, dandoti più tempo per riavere il tuo accesso, quindi usa i compilatori javacript :

È necessario utilizzare Closure Compiler su Advanced Compilation, in quanto è l'unico strumento che rinomina tutte le variabili, anche se utilizzate in più file / moduli. Ma ha solo un problema: funziona solo se scrivi nel suo stile di codifica .


La compilazione di chiusura non è un codice offuscante: P
NiCk Newman,

1
Non è fatto per questo, ma funziona bene nel farlo: non aggiunge codice aggiuntivo come alcuni compilatori (che di solito possono essere invertiti rispetto agli strumenti che ho citato) ma lo cambia in modi non comuni, alcuni addirittura difficili da annullare e rimuove inutilizzati codice, che rispetto all'offuscamento reale è buono per le prestazioni.
Gustavo Rodrigues,

1
Non è una buona idea. La minimizzazione / compilazione del codice sul lato server potrebbe introdurre problemi di sicurezza se il minificatore presenta un bug: zyan.scripts.mit.edu/blog/backdooring-js
mgol

Il bug che hai citato si applica solo a UglifyJS: non si applica al compilatore di chiusura.
Gustavo Rodrigues,

Per tutti coloro a cui interessa minimizzare i file javascript, esiste anche un non-minificatore javascript. quindi non credo sia un livello di sicurezza
Fillipo Sniper,

11

Posso consigliare JavaScript Utility di Patrick J. O'Neil. Può offuscare / compattare e comprimere e sembra essere abbastanza bravo in questi. Detto questo, non ho mai provato a integrarlo in uno script di build di alcun tipo.

Per quanto riguarda l'offuscamento e la minimizzazione, non sono un grande fan del primo. Rende impossibile il debug (errore alla riga 1 ... "aspetta, c'è solo una riga") e richiedono sempre del tempo per decomprimere. Ma se hai bisogno di ... beh.


1
Ma offuscare non necessariamente lo comprime su una riga, potrebbe essere semplice come cambiare la funzione e i nomi delle variabili o convertire le stringhe in base64. La minimizzazione mette tutto il codice su una riga.
rw-nandemo,

Oggi UglifyJS sembra essere la scelta migliore. Anche l'autore è un ragazzo simpatico! :)
Tsvetomir Tsonev,

Per quanto riguarda il debug, puoi principalmente generare sorgenti di dati che puoi includere durante il test in modo da poter vedere su quale riga si è verificato un errore, anche se minimizzato.
Luca Steeb,

5

Suggerirei prima di minimizzare con qualcosa come YUI Compressor, quindi convertire tutte le stringhe e i numeri in valori esadecimali usando qualcosa come http://www.javascriptobfuscator.com/

Con questo, il codice sarebbe reso quasi impossibile da capire e penso che in questa fase ci vorrà più tempo per un hacker per rievocare il tuo codice che effettivamente se riscrisse da zero. Riscrivere e clonare è ciò che non puoi fermare. Dopotutto siamo persone libere!



4

Ho l'impressione che alcune aziende (ad esempio: JackBe) inseriscano il codice JavaScript crittografato nei file * .gif, anziché nei file JS, come ulteriore misura di offuscamento.


4

Prova questo strumento Javascript Obfuscator

L'ho usato sul mio gioco HTML5 non solo ha ridotto le dimensioni da 950 KB a 150, ma ha anche reso reversibili i compilatori e i minificatori di chiusura del codice sorgente illeggibili. Personalmente non so come invertire questa confusione.


4

Uso Jasob da anni ed è senza dubbio il miglior offuscatore là fuori.
Ha un'interfaccia utente avanzata ma è ancora intuitivo e facile da usare.
Gestirà anche file HTML e CSS.

Il modo migliore per usarlo è aggiungere un prefisso a tutte le variabili private con qualcosa di simile a un carattere di sottolineatura, quindi utilizzare la sortfunzione per raggrupparle tutte insieme e controllarle come obiettivi per l'offuscamento.

Gli utenti possono comunque visualizzare la tua fonte, ma è molto più difficile decifrare quando le tue variabili private vengono convertite da qualcosa di simile _sUserPreferredNickNameaa .

Il motore calcolerà automaticamente il numero di variabili targetizzate e le priorità per ottenere la massima compressione.

Non lavoro per Jasob e non riesco a promuoverli, offrendo solo alcuni consigli amichevoli.
Il rovescio della medaglia è che non è gratuito ed è un po 'caro, ma comunque ne vale la pena se confrontato con alternative: le opzioni "gratuite" non si avvicinano nemmeno.


Jason sembra essere più un minificatore che un offuscatore. Mi sto perdendo qualcosa?
Alan McBee - MSFT,

4

Hai provato Bananascript ? Produce codice altamente compresso e completamente illeggibile.


18
comprime bene il codice, ma basta cambiare il eval()nell'ultima riga console.log()e la tua console
sputerà

4

Sto usando l'utility Closure-Compiler per l'offuscamento java-script. Minimizza il codice e ha più opzioni per l'offuscamento. Questa utility è disponibile sul codice di Google all'URL seguente:
Strumenti di chiusura

Ma ora un giorno sento molto parlare di UglifyJS. Puoi trovare vari confronti tra Closure Compiler e UglifyJS in cui Uglify sembra essere un vincitore.
UglifyJS: un nuovo compressore JavaScript veloce per Node.js che è alla pari con la chiusura

Presto darei la possibilità a UglifyJS.




2

Dovresti assolutamente dare un'occhiata a Obfuscriptor .

Vado oltre i tipici trucchi di minimizzazione di Javascript che abbiamo visto da altri strumenti come YUI Compressor o Google Closure .

Il codice offuscato sembra più crittografato. A differenza di qualsiasi cosa abbia mai visto prima.


Grazie per il link! Ho appena provato obfuscriptor e il codice effettivamente crittografato (senza chiave ???). E compresso il mio script da 211 a 36 Kb!

Nota che Obfuscriptor ti avverte che non funziona con IE. Questo è un affare per alcuni.
Alan McBee - MSFT,

1
Il link sulla risposta non punta più allo strumento. Non potrei trovare un altro riferimento dal vivo ad esso.
Buzoherbert,

il primo link è morto. "Obfuscriptor"
Alp Altunel,

2

Se si utilizza una libreria JavaScript, prendere in considerazione Dojo Toolkit che è compatibile (dopo modifiche minori) con la compilazione in modalità avanzata del compilatore di chiusura.

Dojo: l'unica libreria JavaScript compatibile con il compilatore di chiusura

Il codice compilato con la modalità Advanced Closure è quasi impossibile da decodificare, anche passando attraverso un estetista, poiché l' intera base di codice (inclusa la libreria) viene offuscata. È anche mediamente piccola del 25%.

Il codice JavaScript che è semplicemente minimizzato (Compressore YUI, Uglify ecc.) È facile da decodificare dopo aver attraversato un estetista.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.