Voglio creare un'applicazione JavaScript che non sia open source, e quindi desidero imparare come offuscare il mio codice JS? È possibile?
Voglio creare un'applicazione JavaScript che non sia open source, e quindi desidero imparare come offuscare il mio codice JS? È possibile?
Risposte:
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.
--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.
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 "
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.
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.
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.
[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.
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?
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?
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C Crea un file php difficile da visualizzare con il codice reale all'interno
Cosa significa questo codice php?
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=';}; ?>
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.
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 ...
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.
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.
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 .
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.
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!
Dean Edward's Packer è un eccellente offuscatore, sebbene offusca principalmente il codice, non qualsiasi elemento stringa che potresti avere nel tuo codice.
Vedi: Strumento di compressione Javascript online e seleziona Packer (Dean Edwards) dal menu a discesa
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.
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 sort
funzione 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 _sUserPreferredNickName
aa
.
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.
Hai provato Bananascript ? Produce codice altamente compresso e completamente illeggibile.
eval()
nell'ultima riga console.log()
e la tua console
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.
Come offuscatore / compressore JavaScript / HTML / CSS puoi anche provare Patu Digua .
Questo minimizza ma non offusca. Se non desideri utilizzare la riga di comando Java, puoi incollare il tuo javascript in un modulo web.
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.
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.
L'ho usato in passato e fa un buon lavoro. Non è gratuito, ma dovresti assolutamente dare un'occhiata.
JavaScript Obfuscator & Encoder