Ich möchte eine JavaScript-Anwendung erstellen, die nicht Open Source ist, und möchte daher lernen, wie ich meinen JS-Code verschleiern kann. Ist das möglich?
Ich möchte eine JavaScript-Anwendung erstellen, die nicht Open Source ist, und möchte daher lernen, wie ich meinen JS-Code verschleiern kann. Ist das möglich?
Antworten:
Verschleierung:
Versuchen Sie es mit YUI Compressor . Es ist ein sehr beliebtes Tool, das vom Yahoo UI-Team erstellt, erweitert und gewartet wird.
Sie können auch verwenden:
UPDATE: Diese Frage wurde ursprünglich vor mehr als 10 Jahren gestellt und YUI wird nicht mehr gepflegt. Google Closure Compiler wird weiterhin verwendet, und UglifyJS kann lokal über den Node Package Manager ausgeführt werden:npm install -g uglify-js
Private String-Daten:
Die Geheimhaltung von Zeichenfolgenwerten ist ein anderes Problem, und die Verschleierung ist nicht wirklich von großem Nutzen. Wenn Sie Ihre Quelle in ein verstümmeltes, minimiertes Chaos packen, erhalten Sie natürlich eine leichte Version von Sicherheit durch Dunkelheit . In den meisten Fällen ist es Ihr Benutzer, der die Quelle anzeigt, und die Zeichenfolgenwerte auf dem Client sind für ihre Verwendung vorgesehen, sodass eine Art privater Zeichenfolgenwert nicht häufig erforderlich ist.
Wenn Sie wirklich einen Wert hätten, den ein Benutzer nie sehen sollte, hätten Sie mehrere Optionen. Zunächst können Sie eine Art Verschlüsselung durchführen, die beim Laden der Seite entschlüsselt wird. Das wäre wahrscheinlich eine der sichersten Optionen, aber auch eine Menge Arbeit, die möglicherweise unnötig ist. Sie könnten wahrscheinlich base64 einige Zeichenfolgenwerte codieren, und das wäre einfacher. Aber jemand, der diese Zeichenfolgenwerte wirklich wollte, könnte sie leicht decodieren . Die Verschlüsselung ist der einzige Weg, um wirklich zu verhindern, dass jemand auf Ihre Daten zugreift, und die meisten Menschen finden, dass dies mehr Sicherheit ist, als sie benötigen.
Randnotiz:
Es ist bekannt, dass die Verschleierung in Javascript einige Fehler verursacht. Die Verschleierer werden ein wenig besser, aber viele Outfits entscheiden, dass sie genug Nutzen aus dem Minimieren und Zippen ziehen , und die zusätzlichen Einsparungen bei der Verschleierung sind nicht immer die Mühe wert . Wenn Sie versuchen, Ihre Quelle zu schützen, entscheiden Sie vielleicht, dass es sich lohnt, nur um Ihren Code schwerer lesbar zu machen. JSMin ist eine gute Alternative.
--preserve-semi
. Das Umschreiben der privaten Variablen in a, b, c usw. ist normalerweise sicher. Eine andere Sache, die ich mache, ist, den Minifier nach jedem Semikolon im Code einen Zeilenumbruch setzen zu lassen --line-break 0
. Wenn es dann in der Produktion zu Fehlern kommt, habe ich am wenigsten eine gültige Referenzzeile, aus der ich arbeiten kann, und kann diesen Code in meiner Entwicklungskopie finden. Andernfalls erhalten Sie nur einen Fehler in einer massiven Codezeile und keine Ahnung, wo der Fehler liegt.
Ich bin überrascht, dass niemand den Closure Compiler von Google erwähnt hat . Es wird nicht nur minimiert / komprimiert, sondern analysiert, um nicht verwendeten Code zu finden und zu entfernen, und es wird neu geschrieben, um eine maximale Minimierung zu erzielen. Es kann auch eine Typprüfung durchführen und warnt vor Syntaxfehlern.
JQuery wechselte kürzlich von YUI Compresser zu Closure Compiler und sah eine " solide Verbesserung ".
Verschleierung kann niemals wirklich funktionieren. Für alle, die wirklich auf Ihren Code zugreifen möchten, ist dies nur eine Geschwindigkeitsüberschreitung. Schlimmer noch, es hält Ihre Benutzer davon ab, Fehler zu beheben (und die Korrekturen an Sie zurückzusenden), und erschwert es Ihnen, Probleme vor Ort zu diagnostizieren. Es ist eine Verschwendung von Zeit und Geld.
Sprechen Sie mit einem Anwalt über das Recht des geistigen Eigentums und Ihre rechtlichen Möglichkeiten. "Open Source" bedeutet nicht "Leute können die Quelle lesen". Stattdessen ist Open Source ein bestimmtes Lizenzmodell, das die Erlaubnis erteilt, Ihren Code frei zu verwenden und zu ändern. Wenn Sie eine solche Lizenz nicht gewähren, verstoßen Personen, die Ihren Code kopieren, gegen diese Bestimmungen, und (in den meisten Ländern der Welt) haben Sie rechtliche Möglichkeiten, sie zu stoppen.
Die einzige Möglichkeit, Ihren Code wirklich zu schützen, besteht darin, ihn nicht zu versenden. Verschieben Sie den wichtigen Code serverseitig und lassen Sie Ihren öffentlichen Javascript-Code Ajax-Aufrufe ausführen.
Sie können die Javascript-Quelle nach Belieben verschleiern, sie ist jedoch immer rückentwickelbar, da der gesamte Quellcode tatsächlich auf dem Client-Computer ausgeführt werden muss. Die beste Option, die ich mir vorstellen kann, besteht darin, die gesamte Verarbeitung durchzuführen mit serverseitigem Code, und der gesamte Client-Code, den Javascript ausführt, sendet Anforderungen zur Verarbeitung an den Server selbst. Andernfalls kann jeder immer alle Vorgänge verfolgen, die der Code ausführt.
Jemand erwähnte base64, um die Sicherheit der Zeichenfolgen zu gewährleisten. Das ist eine schreckliche Idee. Base64 ist sofort an den Personen erkennbar, die Ihren Code zurückentwickeln möchten. Das erste, was sie tun werden, ist es zu entschlüsseln und zu sehen, was es ist.
Es gibt eine Reihe von JavaScript-Verschleierungstools, die frei verfügbar sind. Ich denke jedoch, dass es wichtig ist zu beachten, dass es schwierig ist, JavaScript so weit zu verschleiern, dass es nicht mehr rückentwickelt werden kann.
Zu diesem Zweck gibt es mehrere Optionen, die ich bis zu einem gewissen Grad für Überstunden verwendet habe:
YUI-Kompressor . Der JavaScript-Kompressor von Yahoo! leistet gute Arbeit bei der Verdichtung des Codes, wodurch die Ladezeit verbessert wird. Es gibt einen kleinen Grad an Verschleierung, der relativ gut funktioniert. Im Wesentlichen ändert Compressor Funktionsnamen, entfernt Leerzeichen und ändert lokale Variablen. Das benutze ich am häufigsten. Dies ist ein Open-Source-Java-basiertes Tool.
JSMin ist ein von Douglas Crockford geschriebenes Tool, mit dem Sie Ihre JavaScript-Quelle minimieren können. In Crockfords eigenen Worten: "JSMin verschleiert nicht, aber es hässlich." Das Hauptziel besteht darin, die Größe Ihrer Quelle zu minimieren, um das Laden in Browsern zu beschleunigen.
Kostenloser JavaScript Obfuscator . Dies ist ein webbasiertes Tool, das versucht, Ihren Code durch tatsächliche Codierung zu verschleiern. Ich denke, dass die Kompromisse bei der Codierung (oder Verschleierung) auf Kosten der Dateigröße gehen könnten. Dies ist jedoch eine Frage der persönlichen Präferenz.
[ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]
Vars in zumindest [var1, var2,..]
innerhalb einer einzigen Minute. Ich kann innerhalb von zwei Minuten buchstäblich die Namen von Variablen entfernen, erneut einrücken und suchen / ersetzen. Und nein, ich bin schlauer als ein durchschnittlicher Jr. Dev. Die einfache Tatsache ist, dass es KEINE Möglichkeit gibt, clientseitiges JS zu verschleiern. Sie können sich 5 Minuten kaufen, MAX, aber das nützt nichts. Dieses Zeug ist wirklich nur, um jemanden zu verkaufen, der keinen Code für zusätzliche "Sicherheit" kennt. Niemand, der jemals eine Zeile von JS geschrieben hat, würde diesen Mist kaufen.
Was ich tun würde:
A. Troll den Hacker!
Dies wird im zweiten Teil mein gefälschter / verschleierter geheimer Javascript-Code LAUNCHER sein. Die, die Sie im Quellcode sehen.
Was bedeutet dieser Code?
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. Verschleiern Sie den Code ein wenig
Was ist das?
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C Erstellen Sie eine schwer anzuzeigende PHP-Datei mit dem darin enthaltenen Code
Was bedeutet dieser PHP-Code?
Wenn alles in Ordnung ist, wird Ihnen der richtige Code angezeigt, ansonsten ein gefälschter Code oder eine IP-Sperre. Schließen Sie die Seite.
<?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';
FAKE = window.open('', '_self', '');window.close();
Wenn Sie Ereignishandler im SECRET-Javascript definieren, ist dies wahrscheinlich zugänglich. Sie müssen sie außerhalb mit dem Startcode definieren und auf eine verschachtelte SECRET-Funktion verweisen.
SO ... gibt es eine einfache Möglichkeit, den Code zu erhalten?
document.body.appendChild(document.createElement('div')).innerText='Awesome';
Ich bin nicht sicher, ob dies funktioniert, aber ich verwende Chrome und überprüfe Elemente, Ressourcen, Netzwerk, Quellen, Zeitleiste, Profile, Audits, aber ich habe die obige Zeile nicht gefunden.
note1: Wenn du die Troll.php-URL von Inspect element-> network in Chrome öffnest, erhältst du den gefälschten Code.
Anmerkung 2: Der gesamte Code ist für moderne Browser geschrieben. Polyfill benötigt viel mehr Code.
BEARBEITEN
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=';}; ?>
Versuchen Sie es mit JScrambler . Ich habe es kürzlich ausprobiert und war beeindruckt. Es bietet eine Reihe von Vorlagen für die Verschleierung mit vordefinierten Einstellungen für diejenigen, denen die Details nicht besonders wichtig sind und die es nur schnell erledigen möchten. Sie können auch eine benutzerdefinierte Verschleierung erstellen, indem Sie die gewünschten Transformationen / Techniken auswählen.
Das Problem mit interpretierten Sprachen besteht darin, dass Sie die Quelle senden, um sie zum Laufen zu bringen (es sei denn, Sie haben einen Compiler zum Bytecode, aber das Dekompilieren ist ziemlich trivial).
Wenn Sie also nicht auf Leistung verzichten möchten, können Sie nur auf Variablen- und Funktionsnamen reagieren, z. Ersetzen Sie sie durch a, b ... aa, ab ... oder a101, a102 usw. Und entfernen Sie natürlich so viel Platz / Zeilenumbrüche wie möglich (das tun sogenannte JS-Kompressoren).
Das Verschleiern von Zeichenfolgen hat einen Leistungseinbruch, wenn Sie sie in Echtzeit verschlüsseln und entschlüsseln müssen. Außerdem kann ein JS-Debugger die endgültigen Werte anzeigen ...
Im Gegensatz zu den meisten anderen Antworten, die ich gegen YUI Compressor vorschlage; Sie sollten Google Closure verwenden .
Nicht viel, weil es mehr komprimiert, aber hauptsächlich, weil es Javascript-Fehler a = [1,2,3,];
abfängt , wie zum Beispiel , dass der IE durcheinander gerät.
Eine nicht Open-Source-Javascript-basierte Anwendung ist ziemlich dumm. Javascript ist eine clientseitig interpretierte Sprache. Verschleierung ist nicht viel Schutz.
JS-Verschleierung wird normalerweise durchgeführt, um die Größe des Skripts zu verringern, anstatt es zu "schützen". Wenn Sie sich in einer Situation befinden, in der Ihr Code nicht öffentlich sein soll, ist Javascript nicht die richtige Sprache.
Es gibt viele Werkzeuge, aber die meisten haben aus einem bestimmten Grund das Wort "Kompressor" (oder "Minifier") im Namen.
Sie können den clientseitigen Code nicht sichern: Drücken Sie in Google Chrome einfach F12, unterbrechen Sie die Ausführung von Javascript, und Sie erhalten alle Zeichenfolgen, auch die verschlüsselten. Verschönern Sie es und benennen Sie Variablen um, und Sie erhalten fast den ursprünglichen Code.
Wenn Sie serverseitiges Javascript (dh NodeJS) schreiben, haben Sie Angst davor, dass sich jemand in Ihren Server hackt, und möchten, dass der Hacker schwieriger arbeitet, sodass Sie mehr Zeit haben, Ihren Zugriff wieder herzustellen , verwenden Sie Javacript-Compiler :
Sie müssen Closure Compiler für die erweiterte Kompilierung verwenden, da dies das einzige Tool ist, das alle Ihre Variablen umbenennt, auch wenn diese in mehreren Dateien / Modulen verwendet werden. Aber es gibt nur ein Problem: Es funktioniert nur, wenn Sie im Codierungsstil schreiben .
Ich kann das JavaScript Utility von Patrick J. O'Neil empfehlen . Es kann verschleiern / verdichten und komprimieren und es scheint ziemlich gut darin zu sein. Trotzdem habe ich nie versucht, es in ein Build-Skript zu integrieren.
Was das Verschleiern oder Minimieren betrifft - ich bin kein großer Fan des ersteren. Es macht das Debuggen unmöglich (Fehler in Zeile 1 ... "Warte, es gibt nur eine Zeile") und das Entpacken dauert immer einige Zeit. Aber wenn Sie müssen ... gut.
Ich würde vorschlagen, zuerst mit etwas wie YUI Compressor zu minimieren und dann alle Zeichenfolgen und Zahlen mit etwas wie http://www.javascriptobfuscator.com/ in HEX-Werte umzuwandeln.
Damit wäre der Code nahezu unverständlich und ich denke, dass es in diesem Stadium länger dauern wird, bis ein Hacker Ihren Code nachspielt, als wenn er ihn von Grund auf neu geschrieben hätte. Umschreiben und Klonen ist das, was Sie eigentlich nicht aufhalten können. Immerhin sind wir freie Menschen!
Dean Edwards Packer ist ein ausgezeichneter Verschleierer, obwohl er in erster Linie den Code verschleiert und keine Zeichenfolgenelemente, die Sie möglicherweise in Ihrem Code haben.
Siehe: Online Javascript Compression Tool und wählen Sie Packer (Dean Edwards) aus der Dropdown-Liste
Probieren Sie dieses Tool Javascript Obfuscator
Ich habe es in meinem HTML5-Spiel verwendet, es hat nicht nur die Größe von 950 KB auf 150 reduziert, sondern auch den Quellcode unlesbar gemacht. Closer und Minifiers sind geschlossen. Ich persönlich weiß nicht, wie ich diese Verschleierung umkehren soll.
Ich benutze Jasob seit Jahren und es ist zweifellos der beste Verschleierer da draußen.
Es hat eine erweiterte Benutzeroberfläche, ist aber dennoch intuitiv und einfach zu bedienen.
Es werden auch HTML- und CSS-Dateien verarbeitet.
Der beste Weg , es zu benutzen ist , um alle Ihre Präfixe privaten Variablen mit so etwas wie ein Unterstrich, dann verwenden , um die sort
Funktion zu gruppieren sie alle zusammen und überprüfen sie als Ziele für die Verschleierung ab.
Die Benutzer können Ihre Quelle sehen, aber es ist viel schwieriger zu entziffern , wenn Ihre privaten Variablen aus so etwas wie umgewandelt _sUserPreferredNickName
zu a
.
Die Engine zählt automatisch die Anzahl der Zielvariablen und priorisiert sie, um die maximale Komprimierung zu erzielen.
Ich arbeite nicht für Jasob und ich habe nichts davon, sie zu promoten, nur freundliche Ratschläge zu geben.
Der Nachteil ist, dass es nicht kostenlos und ein wenig teuer ist, aber es lohnt sich trotzdem, wenn es gegen Alternativen gestapelt wird - die "kostenlosen" Optionen kommen nicht einmal nahe.
Haben Sie Bananascript ausprobiert ? Es erzeugt stark komprimierten und völlig unlesbaren Code.
eval()
in der letzten Zeile in console.log()
und Ihre Konsole wird das Ganze ausspucken
Ich verwende das Dienstprogramm Closure-Compiler für die Verschleierung von Java-Skripten. Es minimiert den Code und bietet mehr Optionen für die Verschleierung. Dieses Dienstprogramm ist unter Google-Code unter der folgenden URL verfügbar:
Closure Tools
Aber jetzt, seit Tagen, höre ich viel von UglifyJS. Sie können verschiedene Vergleiche zwischen Closure Compiler und UglifyJS finden, bei denen Uglify ein Gewinner zu sein scheint.
UglifyJS: Ein schneller neuer JavaScript-Kompressor für Node.js, der dem Abschluss ebenbürtig ist
Bald würde ich UglifyJS eine Chance geben.
Als JavaScript / HTML / CSS-Verschleierer / Kompressor können Sie auch Patu Digua ausprobieren .
Dieser minimiert , verschleiert aber nicht. Wenn Sie kein Befehlszeilen-Java verwenden möchten, können Sie Ihr Javascript in ein Webformular einfügen.
Sie sollten auf jeden Fall einen Blick auf Obfuscriptor werfen .
Ich gehe über die typischen Javascript-Minimierungstricks hinaus, die wir von anderen Tools wie YUI Compressor oder Google Closure gesehen haben .
Der verschleierte Code sieht eher wie verschlüsselt aus. Im Gegensatz zu allem, was ich zuvor gesehen habe.
Wenn Sie eine JavaScript-Bibliothek verwenden, ziehen Sie das Dojo Toolkit in Betracht, das (nach geringfügigen Änderungen) mit der Kompilierung des erweiterten Modus des Closure Compilers kompatibel ist.
Dojo - Die einzige JavaScript-Bibliothek, die mit dem Closure Compiler kompatibel ist
Code, der im Closure Advanced-Modus kompiliert wurde, kann selbst nach einem Verschönerer kaum rückentwickelt werden, da die gesamte Codebasis (einschließlich der Bibliothek) verschleiert ist. Es ist auch durchschnittlich 25% klein.
Nur minimierter JavaScript-Code (YUI Compressor, Uglify usw.) lässt sich nach dem Durchlaufen eines Verschönerers leicht zurückentwickeln.
Ich habe das in der Vergangenheit benutzt und es macht einen guten Job. Es ist nicht kostenlos, aber Sie sollten auf jeden Fall einen Blick darauf werfen.
JavaScript Obfuscator & Encoder