Wie schütze ich Javascript-Dateien?

73

Ich weiß, dass es unmöglich ist, Quellcode zu verbergen, aber wenn ich beispielsweise eine JavaScript-Datei von meinem CDN mit einer Webseite verknüpfen muss und nicht möchte, dass die Leute den Speicherort und / oder den Inhalt dieses Skripts kennen, ist dies der Fall möglich?

Um beispielsweise ein Skript von einer Website zu verlinken, verwenden wir:

<script type="text/javascript" src="http://somedomain.com/scriptxyz.js">
</script>

Ist es nun möglich, sich vor dem Benutzer zu verstecken, von dem das Skript stammt, oder den Skriptinhalt auszublenden und ihn dennoch auf einer Webseite zu verwenden?

Würde das funktionieren, wenn Sie es beispielsweise in meinem privaten CDN speichern, das ein Kennwort für den Zugriff auf Dateien benötigt? Wenn nicht, was würde funktionieren, um das zu bekommen, was ich will?

Jmlevick
quelle
1
Jeder mit halbwegs guten JS-Kenntnissen kann sowieso replizieren, was Sie tun. Es sei denn, Sie tun etwas wirklich bahnbrechendes ... Diese Frage wurde auf dieser Website viele Male beantwortet, mit immer den gleichen Antworten ...
Russell Dias
Verwenden Sie Encode.js: encodejs.devincity.com
nachshon f
Welchen Mechanismus verwendet encode.js aus der Devincity? Ich versuchte es. Es funktioniert gut. Gibt es eine Möglichkeit, es zu dekodieren?
Vignesh Bhaskar
Es ist nicht möglich, JS 100% gegen Spionageaugen zu sichern, aber Sie können 100% sehr nahe kommen. Ich habe eine Methode entwickelt, die ziemlich einfach und leicht zu implementieren ist und es praktisch unmöglich macht, dass jemand durchbricht. Es basiert auf dem Abrufen von JS als kennwortverschlüsselte Zeichenfolge aus PHP mit jQuery.getScript, dem anschließenden Entschlüsseln des JS und dem Ausführen mit eval (). Das verschlüsselte JS wird nur in den Entwicklertools unter "Netzwerk" angezeigt, und Sie müssen das Kennwort kennen, um es zu entschlüsseln. Der schwierige Teil besteht darin, einen kreativen Weg zu finden, um das PW für die JS-Entschlüsselung bereitzustellen und auszublenden.
GeniusDesign

Antworten:

101

Gute Frage mit einer einfachen Antwort: Sie können nicht !

Javascript ist eine clientseitige Programmiersprache, daher funktioniert es auf dem Client-Computer, sodass Sie nichts vor dem Client verbergen können.
Das Verschleiern Ihres Codes ist eine gute Lösung, aber nicht genug, denn obwohl es schwierig ist, könnte jemand Ihren Code entschlüsseln und Ihr Skript "stehlen".
Es gibt einige Möglichkeiten, Ihren Code schwer zu stehlen, aber wie gesagt, nichts ist kugelsicher.

Auf den ersten Blick besteht eine Idee darin, den Zugriff auf Ihre externen JS-Dateien von außerhalb der Seite zu beschränken, in die Sie Ihren Code eingebettet haben. In diesem Fall, falls vorhanden

<script type="text/javascript" src="myJs.js"></script>

Wenn jemand versucht, im Browser auf die Datei myJs.js zuzugreifen , sollte ihm kein Zugriff auf die Skriptquelle gewährt werden.
Wenn Ihre Seite beispielsweise in PHP geschrieben ist, können Sie das Skript über die includeFunktion einschließen und das Skript entscheiden lassen, ob es sicher ist , die Quelle zurückzugeben.
In diesem Beispiel benötigen Sie das externe "js" (in PHP geschrieben) ) Datei myJs.php :

<?php
    $URL = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    if ($URL != "my-domain.com/my-page.php")
    die("/\*sry, no acces rights\*/");
?>
// your obfuscated script goes here

das wäre in deiner Hauptseite my-page.php enthalten :

<script type="text/javascript">
    <?php include "myJs.php"; ?>;
</script> 

Auf diese Weise konnte nur der Browser den Inhalt der js-Datei sehen.

Eine weitere interessante Idee ist, dass Sie am Ende Ihres Skripts den Inhalt Ihres dom-Skriptelements löschen, sodass der Code verschwindet, nachdem der Browser Ihren Code ausgewertet hat:

<script id="erasable" type="text/javascript">
    //your code goes here
    document.getElementById('erasable').innerHTML = "";
</script>

Dies sind alles nur einfache Hacks, die nicht und ich kann das nicht genug betonen: Sie können Ihren js-Code nicht vollständig schützen, aber sie können sicher jemanden verärgern, der versucht, Ihren Code zu "stehlen".

Aktualisieren:

Ich bin kürzlich auf einen sehr interessanten Artikel von Patrick Weid gestoßen, in dem es darum geht, Ihren JS-Code zu verbergen, und er enthüllt einen anderen Ansatz: Sie können Ihren Quellcode in ein Bild codieren! Sicher, das ist auch nicht kugelsicher, aber es ist ein weiterer Zaun , den Sie um Ihren Code herum bauen könnten.
Die Idee hinter diesem Ansatz ist, dass die meisten Browser das Canvas-Element verwenden können, um Pixelmanipulationen an Bildern durchzuführen. Und da das Canvas-Pixel durch 4 Werte (rgba) dargestellt wird, kann jedes Pixel einen Wert im Bereich von 0 bis 255 haben. Das bedeutet, dass Sie in jedem Pixel ein Zeichen (tatsächlich ist es ASCII-Code) speichern können. Der Rest der Codierung / Decodierung ist trivial.
Danke, Patrick!

gion_13
quelle
Etwas hinzufügen: Ich schwöre, ich habe das, wonach ich frage, auf zwei verschiedenen Websites gesehen, beide beim Herunterladen von sozialen Videos. Sie haben offensichtlich Javascript in der einen und PHP in der anderen verwendet, aber in beiden, wenn Sie es sich ansehen Im Quellcode gab es nur den Code für das Formular, in dem Sie die URL eingegeben haben, und nichts weiter, keine Skriptaufrufe, selbst wenn sie SWFObject zum Abspielen der Videos im JWplayer verwendeten. Ich kann mich
momentan
@Jmlevick der PHP-Teil war nur ein Beispiel ... Ich bin sicher, dass es in den meisten serverseitigen Sprachen implementiert werden kann
gion_13
9
Ich fürchte, keines der hier von gion_13 bereitgestellten Beispiele soll Ihren Code wirklich vor dem Abrufen schützen. Im ersten Fall wird durch einfaches Speichern einer clientseitigen Kopie der Webseite auch der js-Code gespeichert. Im zweiten Fall wette ich, dass der gesamte Code bei Betrachtung der ursprünglichen Seitenquelle noch sichtbar ist. Das einzige, was Sie tun können, um <em> zu versuchen <em>, Ihren js-Code zu schützen, ist die Verschleierung. ABER selbst in diesem Fall ist der Code (obwohl schwerer zu lesen) immer clientseitig verfügbar = wenn jemand ihn wirklich "stehlen" will, kann man ihn wirklich nicht aufhalten ... Sie müssen damit fertig werden.
Danicotra
1
Ich habe die zweite Methode ausprobiert, aber sie hat nicht funktioniert. Der Code ist immer auf der Clientseite verfügbar. Wir können nur das Stehlen erschweren.
Saiyajin
1
Danke @ gion_13, Ihre Antwort hat mir eine Idee gegeben. Ich habe eine Anmeldeseite. Ich überprüfe nur, ob der Benutzer bereits angemeldet ist, bevor ich meine JS-Dateien einbinde. Du bist großartig!
Dan Angelo Alcanar
14

Sie können Ihren Code nur verschleiern , um das Lesen zu erschweren. Egal was Sie tun, wenn Sie möchten, dass das Javascript in ihrem Browser ausgeführt wird, müssen sie den Code haben.

GWW
quelle
4

Auf Anhieb könnten Sie so etwas tun (wenn Sie serverseitige Skripte erstellen können, wie es sich anhört):

Anstatt das Skript wie gewohnt zu laden, senden Sie eine AJAX-Anfrage an eine PHP-Seite (es kann alles sein; ich benutze es einfach selbst). Lassen Sie das PHP die Datei suchen (möglicherweise auf einem nicht öffentlichen Teil des Servers), öffnen Sie sie mit file_get_contentsund geben Sie echoden Inhalt als Zeichenfolge zurück (lesen Sie :).

Wenn diese Zeichenfolge zum JavaScript zurückkehrt, lassen Sie sie ein neues scriptTag erstellen , füllen Sie es innerHTMLmit dem soeben erhaltenen Code und hängen Sie das Tag an die Seite an. (Sie könnten Probleme damit haben; innerHTMLmöglicherweise nicht das, was Sie brauchen, aber Sie können experimentieren.)

Wenn Sie dies häufig tun, möchten Sie möglicherweise sogar eine PHP-Seite einrichten, die eine GET-Variable mit dem Namen des Skripts akzeptiert, damit Sie verschiedene Skripte mit demselben PHP dynamisch abrufen können. (Vielleicht könnten Sie stattdessen POST verwenden, um es anderen Leuten nur ein wenig schwerer zu machen, zu sehen, was Sie tun. Ich weiß es nicht.)

EDIT: Ich dachte, Sie wollten nur den Speicherort des Skripts verbergen . Dies würde natürlich nicht viel helfen, wenn Sie versuchen, das Skript selbst zu verbergen.

sdleihssirhc
quelle
3

Meines Wissens ist dies nicht möglich.

Ihr Browser muss Zugriff auf JS-Dateien haben, um sie ausführen zu können. Wenn der Browser Zugriff hat, hat auch der Benutzer des Browsers Zugriff.

Wenn Sie Ihre JS-Dateien mit einem Kennwort schützen, kann der Browser nicht darauf zugreifen, was den Zweck von JS zunichte macht.

Darioo
quelle
3

Vergiss es, das ist nicht machbar.

Egal was Sie versuchen, es wird nicht funktionieren. Alles, was ein Benutzer tun muss, um Ihren Code und seinen Speicherort zu ermitteln, ist, in Firebug auf der Registerkarte "Netz" nachzuschauen oder mithilfe von Fiddler zu ermitteln, welche Anforderungen gestellt werden.

Martin Jespersen
quelle
3

Google Closure Compiler , YUI-Kompressor , Minify , / Packer / ... usw. sind Optionen zum Komprimieren / Verschleiern Ihrer JS-Codes. Aber keiner von ihnen kann Ihnen helfen, Ihren Code vor den Benutzern zu verbergen.

Jeder mit anständigen Kenntnissen kann Ihren Code mit Tools wie JS Beautifier leicht dekodieren / verschleiern . Sie nennen es.

Die Antwort lautet also: Sie können das Lesen / Dekodieren Ihres Codes immer erschweren, aber es gibt sicher keine Möglichkeit, sich zu verstecken.

Lionel Chan
quelle
2

Ich denke, die einzige Möglichkeit besteht darin, die erforderlichen Daten auf dem Server abzulegen und nur angemeldeten Benutzern den Zugriff auf die Daten nach Bedarf zu ermöglichen (Sie können auch einige Berechnungen serverseitig durchführen). Dies schützt Ihren Javascript-Code nicht, macht ihn jedoch ohne den serverseitigen Code nicht funktionsfähig

Auswurf
quelle
1

Ich stimme allen anderen hier zu: Mit JS auf dem Kunden ist die Katze aus dem Sack und es gibt nichts, was absolut narrensicher ist.

Nachdem ich das gesagt habe; In einigen Fällen mache ich dies, um denjenigen, die sich den Code ansehen möchten, einige Hürden in den Weg zu stellen. So funktioniert der Algorithmus (grob)

  1. Der Server erstellt 3 Hash- und Salted-Werte. Einer für den aktuellen Zeitstempel und die anderen beiden für jede der nächsten 2 Sekunden. Diese Werte werden über Ajax als durch Kommas getrennte Zeichenfolge an den Client gesendet. von meinem PHP-Modul. In einigen Fällen können Sie diese Werte beim Erstellen der Seite fest in einen HTML-Skriptabschnitt einbetten und dieses Skript-Tag löschen, sobald die Verwendung der Hashes beendet ist. Der Server ist CORS-geschützt und führt alle üblichen SERVER_NAME usw. Aus check (was kein großer Schutz ist, aber zumindest ein gewisses Maß an Widerstand gegen Script-Kiddies bietet).

  2. Es wäre auch schön, wenn der Server prüfen würde, ob tatsächlich ein Client eines authentifizierten Benutzers dies tut

  3. Der Client sendet dann die gleichen 3 Hash-Werte über einen Ajax-Aufruf an den Server zurück, um die tatsächliche JS abzurufen, die ich benötige. Der Server vergleicht die Hashes mit dem aktuellen Zeitstempel dort ... Die drei Werte stellen sicher, dass die Daten innerhalb des 3-Sekunden-Fensters gesendet werden, um die Latenz zwischen dem Browser und dem Server zu berücksichtigen

  4. Der Server muss davon überzeugt sein, dass einer der Hashes korrekt übereinstimmt. und wenn ja, würde es das entscheidende JS an den Client zurücksenden. Dies ist ein einfaches, grobes "Einmalkennwort", ohne dass eine Datenbank im Backend erforderlich ist.

  5. Dies bedeutet, dass jeder Hacker nur die 3-Sekunden-Fensterperiode seit der Generierung des ersten Satzes von Hashes hat, um zum tatsächlichen JS-Code zu gelangen.

  6. Der gesamte Client-Code kann sich in einer IIFE-Funktion befinden, sodass einige der Variablen im Client noch schwieriger von der Inspector-Konsole aus zu lesen sind

    Dies ist keine tiefgreifende Lösung: Ein entschlossener Hacker kann sich registrieren, ein Konto einrichten und dann den Server bitten, die ersten drei Hashes zu generieren. durch Tricks, um Ajax und CORS zu umgehen; Lassen Sie den Client dann den zweiten Aufruf ausführen, um zum eigentlichen Code zu gelangen - dies ist jedoch ein angemessener Arbeitsaufwand.

Darüber hinaus, wenn das vom Server verwendete Salt auf den Anmeldeinformationen basiert; Der Server kann möglicherweise erkennen, wer der Benutzer ist, der versucht hat, das vertrauliche JS abzurufen. (Der Server muss weitere zusätzliche Arbeiten zum Verhalten des Benutzers ausführen, nachdem das vertrauliche JS abgerufen wurde, und die Person blockieren, wenn die Person beispielsweise zum Beispiel keine andere Aktivität durchgeführt, die erwartet wurde)

Eine alte, grobe Version davon wurde für einen Hackathon hier erstellt: http://planwithin.com/demo/tadr.html Das funktioniert nicht, wenn der Server zu viel Latenz erkennt und die 3-Sekunden-Fensterperiode überschreitet

S. Francis
quelle
0

Wie ich in dem Kommentar sagte, den ich zuvor auf gion_13 Antwort hinterlassen habe (bitte lesen), können Sie das wirklich nicht. Nicht mit Javascript.

Wenn Sie nicht möchten, dass der Code clientseitig verfügbar ist (= ohne großen Aufwand stehlbar), würde ich vorschlagen, PHP (ASP, Python, Perl, Ruby, JSP + Java-Servlets) zu verwenden, das als Server verarbeitet wird -side und nur die Ergebnisse der Berechnung / Codeausführung werden dem Benutzer bereitgestellt. Oder, wenn Sie es vorziehen, sogar Flash oder ein Java-Applet, das clientseitige Berechnungen / Codeausführungen ermöglicht, aber kompiliert und daher schwieriger rückzuentwickeln ist (also nicht unmöglich).

Nur meine 2 Cent.

Danicotra
quelle
0

Sie können auch einen MIME-Typ für Anwendung / JavaScript einrichten, der als PHP, .NET, Java oder eine andere von Ihnen verwendete Sprache ausgeführt wird. Ich habe dies in der Vergangenheit für dynamische CSS-Dateien getan.

Sybercoda
quelle
0

Ich weiß, dass dies der falsche Zeitpunkt ist, um diese Frage zu beantworten, aber ich habe nur an etwas gedacht

Ich weiß, es könnte stressig sein, aber zumindest könnte es immer noch funktionieren

Jetzt ist der Trick zu erstellenViele serverseitige Codierungsskripte müssen dekodierbar sein (z. B. ein Skript, das alle Vokale durch Zahlen ersetzt und jedem Konsonanten den Buchstaben 'a' hinzufügt, damit das Wort 'bat' zu ba1ta wird). Anschließend muss ein Skript erstellt werden, das dies ermöglicht Randomisieren Sie zwischen den Codierungsskripten und erstellen Sie ein Cookie mit dem Namen des verwendeten Codierungsskripts (schneller Tipp: Versuchen Sie, den tatsächlichen Namen des Codierungsskripts für das Cookie nicht zu verwenden, wenn unser Cookie beispielsweise den Namen 'encoding_script_being_used' und das Randomisierungsskript lautet Wenn Sie ein Codierungsskript mit dem Namen MD10 auswählen, versuchen Sie, MD10 nicht als Wert des Cookies zu verwenden, sondern "encoding_script4567656", um das Erraten zu verhindern. Nachdem das Cookie erstellt wurde, sucht ein anderes Skript nach dem Cookie mit dem Namen "encoding_script_being_used" und ruft den Wert ab.Dann wird bestimmt, welches Codierungsskript verwendet wird.

Der Grund für die Randomisierung zwischen den Codierungsskripten war nun, dass die serverseitige Sprache zufällig auswählt, welches Skript zum Decodieren Ihrer Datei javascript.js verwendet werden soll, und dann eine Sitzung oder ein Cookie erstellt, um zu wissen, welche Codierungsskripten verwendet wurden. Dann codiert die serverseitige Sprache auch Ihre Javascript .js und setzen Sie es als Cookie






Lassen Sie mich nun mit einem Beispiel zusammenfassen, wie

PHP zwischen einer Liste von Codierungsskripten randomisiert und javascript.js verschlüsselt. Anschließend wird ein Cookie erstellt, das der clientseitigen Sprache mitteilt, welches Codierungsskript verwendet wurde. Die clientseitige Sprache decodiert dann das Cookie javascript.js (was offensichtlich ist) codiert)

Leute können deinen Code also nicht stehlen

aber ich würde dies nicht empfehlen, weil

  1. Es ist ein langer Prozess
  2. Es ist zu stressig

quelle