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?
javascript
source-code-protection
Jmlevick
quelle
quelle
Antworten:
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
include
Funktion 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!
quelle
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.
quelle
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_contents
und geben Sieecho
den Inhalt als Zeichenfolge zurück (lesen Sie :).Wenn diese Zeichenfolge zum JavaScript zurückkehrt, lassen Sie sie ein neues
script
Tag erstellen , füllen Sie esinnerHTML
mit dem soeben erhaltenen Code und hängen Sie das Tag an die Seite an. (Sie könnten Probleme damit haben;innerHTML
mö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.
quelle
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.
quelle
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.
quelle
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.
quelle
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
quelle
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)
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).
Es wäre auch schön, wenn der Server prüfen würde, ob tatsächlich ein Client eines authentifizierten Benutzers dies tut
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
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.
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.
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
quelle
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.
quelle
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.
quelle
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
quelle