PHP Blogger

Startseite Schreib mir ne Mail! RSS Abo Webnews

Javascript und CSS verstecken, ein Ansatz zum Verbessern

Nervt es, dass sich jeder eure tollen Javascript-Funktionen einfach runterladen kann? Habt ihr gerade ein neues Layout gebaut, das endlich komplett ohne Markup auskommt und wollt ein Patent anmelden? Vielleicht ist hier eine kleine Möglichkeit Quellcode Dieben zumindest ein wenig die Tour zu vermasseln.

Wie habt ihr eure Script-Bibliotheken ins HTML eingebunden?

<script src="http://www.phpblogger.net/js/a.js"></script>
<script src="http://www.phpblogger.net/js/b.js"></script>
<script src="http://www.phpblogger.net/js/c.js"></script>
<script src="http://www.phpblogger.net/js/d.js"></script>
...

Also wie kann die Situation verbessert werden? Dafür habe ich mir ein wenig mit Hilfe von mod_rewrite und $_SESSION-Variablen eine kleine Umgebung geschaffen, die all das da oben ersetzen kann. Für jede Library, ob JS oder CSS setze ich in meinem Programm-Code in bsp. $_SESSION['jsLibs'][] = ‘a.js’. In meinem Quellcode habe ich nur noch folgenden Aufruf:

<script src="http://www.phpblogger.net/js/common.js"></script>

Und in meiner .htaccess habe ich

RewriteRule (.*)common.js$ /libraryLoader.php [L]

Der Code sieht dann etwa so aus:

header('Content-Type: application/x-javascript');

foreach($_SESSION['jsLibs'] as $v) {
  if(file_exists($euerScriptDir . $v)) $content .= file_get_contents($euerScriptDir . $v);
}

//Das Beste ist ihr könnt den JS-Code dynamisch verändern
//Ich benutze das z.B. um meine Sprach-Variablen zu setzen
$content =  str_replace('abc', 'def', $content); 

echo $content;

//Und das Wichtigste
$_SESSION['jsLibs'] = array();

Das Interessante ist jetzt die letzte Zeile. Dadurch, dass nach dem erstmaligen Laden der Bibliotheken das Array geleert wird, bekommt die Seite den richtigen JS-Code, aber wenn man das .js manuell aufruft, ist die Variable leer und man bekommt ein leeres Dokument zurückgeliefert. Das Ganze passiert sogar bei ausgeschaltetem Javascript. Auch dann bleibt die Seite leer. Da soll mal noch jemand versuchen meine schönen Implementierungen zu kopieren (was natürlich trotzdem geht, aber ich muss ja nicht gleich verraten wie, oder?)

  • MisterWong
  • del.icio.us
  • Technorati
  • Digg
  • Slashdot
  • YahooMyWeb
  • Furl
  • Ma.gnolia
  • Spurl
  • Netscape
  • StumbleUpon
  • MyShare
  • blogmarks

Sergej meint dazu:

14. Mai 2007 um 22:31

Super Tipp!
Und wie sieht es mit dem Cache des Browsers aus? Die JS-Dateien tut er nicht mehr cachen oder? Müsste man probieren…

phil meint dazu:

16. Mai 2007 um 00:34

Hi,
meinst du wegen der übertragenen Daten? Für meinen Teil sieht es so aus, als ob das Javascript jedes Mal neu übertragen wird. Das ist aber bei mir auch teilweise gewollt, damit ich nicht auf jeder Seite sowas wie den Code für den WYSIWG Editor laden muss, weil da gibt es teilweise auch große Dateien. Aber da werde ich noch mal investigieren, ob man das auch cachen lassen kann.

So, nach einigen Tests kann ich sagen, dass man die JS Dateien auch cachen lassen kann. Allerdings muss ich den Algorithmus, wann gecacht werden kann noch ein wenig ausarbeiten. Aber wenn man einen Header header(”HTTP/1.0 304 Not Modified”); schickt, dann wird auch das Skript vom Browser gecacht. Ich melde mich, wenn ich weiß, wie ich rausfinde, ob sich da was getan hat. Wahrscheinlich werde ich nen Wert in der Session speichern oder so.

timi meint dazu:

16. Mai 2007 um 13:18

Ich denke auch, das es vom Last-Modified HTTP Header abhängt. Ein JS ist ja lediglich eine ganz normale Datei, wie ein Bild oder eine HTML Seite auch die vom Browser angefordert wird…

phil meint dazu:

22. Mai 2007 um 00:54

Also, nach ein bisschen Recherche habe ich eine relativ gute Möglichkeit gefunden, mit dem man mit der obigen Methode und Kombinationen von Headern auch das PHP generierte JS vom Browser cachen lassen kann… Ich werde mal ein Update vorbereiten, freut euch schon mal.

Bumbi meint dazu:

30. Mai 2007 um 15:08

Kanns grad net testen :/
Wie siehts aus, wenn man die Seite aufm Rechner speichert?

–Bumbi

phil meint dazu:

2. Juni 2007 um 19:06

Hmmh, ich habe jetzt schon die neuen Cache-Bedingungen eingebaut. Damit landen die Skripte auf jeden Fall auf dem Rechner… Wenn ich aber im Firefox den Cache deaktiviere, dann sind die Skripte auch beim Runterladen geschützt. Zumindest ist danach das .JS nicht mal mehr auf dem Rechner gelandet, vermutlich weil es eben leer war. Muss ich mal noch etwas näher untersuchen.

Sergej meint dazu:

5. Juni 2007 um 15:28

Das schaffst du schon…

Itzi meint dazu:

7. November 2007 um 19:39

Was ein wenig helfen könnte wäre folgendes:
Bei einem Fehler - also bei unerlaubtem Zweitaufruf der Datei - kannst Du statt einer Fehlermeldung, oder nichts ruhig eine Javascriptdatei ausgeben. Allerdings nicht die Richtige, sondern eine ähnliche mit Fehlern oder noch besser eine möglichst riesige.
Da ist die Wahrscheinlichkeit groß, dass der Dieb aufgiebt weil er gar nicht vermitet, dass das JS dynamisch ist.

Grundsätzlich ist die Idee super!
Ich mache genau das zum Verhindern von Videodownloads (dynamisches ausgeben von FLV mit PHP). Kurzsichtigerweise habe ich nie daran gedacht das auch für JS zu verwenden…

Itzi

foo meint dazu:

24. Januar 2008 um 15:11

jeder halbwegs kleine crack bekommt sowieso eure doch so tollen quellen,
denn alles was der browser braucht und somit ja auch zwangsweise bekommt,
faengt man ziemlich leicht ab. ;)

RSS für Kommentare zu diesem Artikel · TrackBack URI

Schreib Deine Meinung