747 Stimmen

Wie kann ich JavaScript verschleiern (schützen)?

Ich möchte eine JavaScript-Anwendung erstellen, die nicht quelloffen ist, und daher möchte ich lernen, wie ich meinen JS-Code verschleiern kann? Ist das möglich?

22 Stimmen

Das Argument, man dürfe nichts verschleiern, scheint mir nicht stichhaltig zu sein. Es sei denn, Sie glauben wirklich, dass Ihre Benutzer Fehler beheben/berichten könnten, dann sollten Sie es tun. Es kann die Ladezeiten durch Minifying verringern. Es wird niemals einen wirklich engagierten Hacker aufhalten, aber es wird ihn/sie verlangsamen und es wird halbherzige Hackversuche verhindern. Es ist sehr einfach zu machen und es gibt viele Tools (siehe andere Antworten), ich würde sagen, mach es auf jeden Fall, da es meistens nur Vorteile bringt, aber erwarte nicht, dass es wirkliche Sicherheit bringt oder jemanden davon abhält, deinen Code zu kopieren, wenn er es wirklich will. Die einzige Möglichkeit, dies zu tun, ist, den Code serverseitig zu halten und Ajax zu verwenden.

0 Stimmen

Der beste Javascript Obfuskator So funktioniert es bei mir. Es wird sogar nicht von js beautifier dekodiert. ;)

1 Stimmen

Die meisten der hier erwähnten Obfuskatoren können einfach durch die Einstellung window.eval = console.log.bind(console); bevor Sie das Skript ausführen. Im besten Fall ist das Ergebnis nach der Ausführung des Skripts dasselbe wie bei der Ausführung eines Minifizierers für das Original, daher sehe ich keine wirklichen Vorteile der Verwendung eines speziellen Obfuskators gegenüber der Verwendung eines Minifizierers. Zumal obfuskierter Code in der Regel aufgeblähter (und langsamer zu laden) ist als minifizierter Code.

29voto

cocco Punkte 15866

Was ich tun würde:

A. Trolle den Hacker!

Dies wird im zweiten Teil mein gefälschter/verschleierter geheimer Javascript-Code LAUNCHER sein. Der, den Sie im Quellcode sehen.

Was bedeutet dieser Code?

  1. lädt den eigentlichen Code
  2. setzt eine benutzerdefinierte Kopfzeile
  3. bucht eine benutzerdefinierte Variable

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. Den Code ein wenig verwirren

Was ist das?

  1. das ist derselbe Code wie oben in base64
  2. dies ist nicht der geheime Javascript-Code

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

C Erstellen Sie eine schwer anzeigbare php-Datei mit dem eigentlichen Code darin

Was bedeutet dieser php-Code?

  1. Überprüft den richtigen Referrer (Domain/Verzeichnis/Code Ihres Launchers)
  2. Prüft, ob der benutzerdefinierte HEADER
  3. Prüft, ob die benutzerdefinierte POST-Variable

Wenn alles in Ordnung ist, wird Ihnen der richtige Code angezeigt, andernfalls ein gefälschter Code oder eine Sperrung der IP, Schließen der Seite was auch immer.

<?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 verweiser = http://here.is/my/launcher.html

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

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

Nun wenn Sie definieren Event-Handler in der SECRET-Javascript ist es wahrscheinlich zugänglich Sie müssen sie außerhalb mit dem Startcode zu definieren und verweist auf eine verschachtelte SECRET-Funktion.

SO... gibt es eine einfache Möglichkeit, den Code zu erhalten? document.body.appendChild(document.createElement('div')).innerText='Awesome';

Ich bin mir nicht sicher, ob das funktioniert, aber ich benutze Chrome und habe Elemente, Ressourcen, Netzwerk, Quellen, Zeitleiste, Profile, Audits überprüft, aber ich habe die Zeile oben nicht gefunden.

Anmerkung 1: Wenn Sie die Troll.php Url von Inspect element->network in Chrome öffnen, erhalten Sie den gefälschten Code.

note2: Der gesamte Code ist für moderne Browser geschrieben. polyfill braucht viel mehr Code.

EDIT

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=';}; ?>

2 Stimmen

Oh, und ja, ich würde auch den Javascript-Code verschlüsseln.

1 Stimmen

Darüber habe ich gerade nachgedacht, als ich den Cracker ansprach. Ich würde gerne so etwas sehen, ohne PHP verwenden zu müssen :)

9 Stimmen

Auch wenn das komisch ist, kann ein Webentwickler, der in der Lage ist, die Website richtig zu inspizieren, irgendwie an den Quellcode kommen. Ich glaube wirklich, dass es keine Möglichkeit gibt, irgendeine Art von Daten in dem Moment zu verstecken, in dem man sie online stellt.

20voto

PhiLho Punkte 39496

Das Problem bei interpretierten Sprachen ist, dass man den Quellcode schicken muss, um sie zum Laufen zu bringen (es sei denn, man hat einen Compiler für Bytecode, aber auch dann ist es recht trivial, sie zu dekompilieren).

Wenn Sie also keine Leistungseinbußen in Kauf nehmen wollen, können Sie nur auf Variablen- und Funktionsnamen einwirken, z. B. indem Sie sie durch a, b... aa, ab... oder a101, a102 usw. ersetzen. Und natürlich sollten Sie so viele Leerzeichen/Neuzeilen wie möglich entfernen (das ist es, was die so genannten JS-Kompressoren tun).
Die Verschleierung von Zeichenketten hat einen Leistungseinbruch zur Folge, wenn Sie sie in Echtzeit ver- und entschlüsseln müssen. Plus ein JS-Debugger kann die endgültigen Werte zeigen...

20voto

Anthony Punkte 215

Versuchen Sie JScrambler . Ich habe es vor kurzem ausprobiert und war beeindruckt davon. Es bietet eine Reihe von Vorlagen für die Obfuskation mit vordefinierten Einstellungen für diejenigen, die sich nicht so sehr um die Details kümmern und es einfach schnell erledigen wollen. Sie können auch eine benutzerdefinierte Obfuskation erstellen, indem Sie die gewünschten Transformationen/Techniken auswählen.

8 Stimmen

JScrambler Abonnement ist sehr sehr teuer... Billigste Abonnement erfordern mindestens 3 Monate Preis $145 - es ist verrückt.

1 Stimmen

Sie haben jetzt einen kostenlosen Plan. Die anderen Abonnementpläne sind immer noch so teuer.

2 Stimmen

Der kostenlose Plan umfasst nur die Optimierung und Minifizierung.

18voto

Thomas Bonini Punkte 42356

Im Gegensatz zu den meisten anderen Antworten schlage ich vor, YUI Compressor nicht zu verwenden; Sie sollten Google Schließung .

Nicht so sehr, weil es mehr komprimiert, sondern vor allem, weil es Javascript-Fehler abfängt wie a = [1,2,3,]; die den IE durcheinander bringen.

5 Stimmen

Sollte die Überprüfung des Codes auf Fehler und Inkompatibilität nicht so oder so durchgeführt werden vor Verschleiern?? hat eigentlich nichts mit Verschleiern zu tun

12voto

Tsvetomir Tsonev Punkte 103396

Ich kann empfehlen JavaScript-Dienstprogramm von Patrick J. O'Neil. Es kann verschleiern/kompaktieren und komprimieren, und es scheint darin ziemlich gut zu sein. Das heißt, ich habe nie versucht, es in ein Build-Skript irgendeiner Art zu integrieren.

Was Obfuscating vs. Minifying betrifft - ich bin kein großer Fan von Ersterem. Es macht die Fehlersuche unmöglich (Fehler in Zeile 1... "warte, es gibt nur eine Zeile") und das Entpacken dauert immer länger. Aber wenn man muss... nun ja.

1 Stimmen

Die Verschleierung muss jedoch nicht unbedingt auf eine Zeile komprimiert werden, sondern kann auch durch die Änderung von Funktions- und Variablennamen oder die Umwandlung von Zeichenketten in base64 erfolgen. Beim Mining wird der gesamte Code auf eine Zeile reduziert.

0 Stimmen

Heutzutage scheint UglifyJS die beste Wahl zu sein. Der Autor ist auch ein cooler Typ! :)

0 Stimmen

Was die Fehlersuche betrifft, so können Sie meistens Sourcecaps generieren, die Sie beim Testen mit einbeziehen können, so dass Sie sehen können, in welcher Zeile ein Fehler aufgetreten ist, selbst wenn diese minifiziert ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X