Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 <<   zurück
JavaScript und AJAX von Christian Wenz
Das umfassende Handbuch
Buch: JavaScript und AJAX

JavaScript und AJAX
839 S., mit DVD, 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-859-1
gp Kapitel 28 Top Secret: Passwortschutz
  gp 28.1 URL aus Passwort
    gp 28.1.1 Passwort == URL
    gp 28.1.2 Passwort » URL
    gp 28.1.3 f : Passwort ® URL
  gp 28.2 Seiten mit Cookies schützen
    gp 28.2.1 Passwort im Quelltext
    gp 28.2.2 Mit Java
  gp 28.3 Ein Blick über den Tellerrand
    gp 28.3.1 PHP
    gp 28.3.2 .htaccess


Rheinwerk Computing

28.2 Seiten mit Cookies schützen  downtop

Um eine Seite mit JavaScript-Mitteln vor unbefugtem Zugriff zu schützen, gibt es prinzipiell zwei Möglichkeiten:

gp  Die Seite wird vollständig von JavaScript erzeugt.
gp  Irgendeine Form der Authentifizierung wird ausgeführt; schlägt diese fehl, wird der Benutzer auf eine Fehlerseite weitergeleitet.

All diese Methoden haben eines gemeinsam: Sie funktionieren ohne JavaScript entweder gar nicht, oder sie können durch das Abschalten von JavaScript ausgehebelt werden (weil dann beispielsweise die Weiterleitung nicht mehr funktioniert).

Wir werfen in diesem Abschnitt nur einen Blick auf diejenigen Möglichkeiten, die eine Seite direkt mit JavaScript schützen. Um einen eingeloggten Benutzer festzustellen, verwenden wir Cookies.


Rheinwerk Computing

28.2.1 Passwort im Quelltext  downtop

Cookies können dazu verwendet werden, Textdaten lokal auf dem Rechner des Benutzers zu speichern. Mehr dazu erfahren Sie in Kapitel 12. In den folgenden Listings werden wir einige der Hilfsfunktionen verwenden, die in diesem Kapitel erstellt worden sind – unter anderem Funktionen zum Setzen und Auslesen von Cookies:

gp  Mit cookie_lesen() lesen Sie den Wert eines Cookies aus.
gp  Mit cookie_setzen() setzen Sie einen Cookie.

Der entsprechende Cookie darf nur dann gesetzt werden, wenn das Passwort korrekt eingegeben worden ist. Dies ist eine weitere Schwäche des Algorithmus, denn wie Sie in Kapitel 27 gesehen haben, lässt sich der eigentliche Quellcode nicht schützen, weswegen ein finsterer Geselle mit ein wenig Mühe das Passwort herausfinden kann.

Für das folgende Beispiel verwenden wir wieder die Funktion codeschutz_encode(). Das Passwort steht dann verschlüsselt, aber mit ein wenig Aufwand knackbar, im Quelltext:

<html>
<head>
<title>Top Secret</title>
<script type="text/javascript"><!--
function cookie_setzen() {
   var anzParameter = cookie_setzen.arguments.length;
   var parameter = cookie_setzen.arguments;
   var name = parameter[0];
   var value = (anzParameter >= 2) ? parameter[1] : "";
   value = escape(value); // URL-Codierung
   var expires = (anzParameter >= 3) ? parameter[2] : null;
   if (expires != null) {
      if (expires.toGMTString) {
         expires = expires.toGMTString();
      }
   }
   var domain = (anzParameter >= 4) ? parameter[3] : null;
   var path = (anzParameter >= 5) ? parameter[4] : null;
   if (path != null) {
      path = escape(path); // Sonderzeichen umwandeln
   }
   var secure = (anzParameter >= 6) ? parameter[5] : null;
   var c = name + "=" + escape(value);
   if (expires != null) {
      c += "; expires=" + expires;
   }
   if (domain != null) {
      c += "; domain=" + domain;
   }
   if (path != null) {
      c += "; path=" + path;
   }
   if (secure) {
      c += "; secure";
   }
   document.cookie = c;
}

function codeschutz_encode(s, delta) {
   var temp = "";
   var alt, neu;
   for (var i=0; i<s.length; i++) {
      alt = s.charCodeAt(i);
      if (alt>=65 && alt<=90) {
         neu = alt + delta;
         if (neu > 90) {
            neu -= 26;
         }
      } else if (alt>=97 && alt<=122) {
         neu = alt + delta;
         if (neu > 122) {
            neu -= 26;
         }
      } else {
         neu = alt;
      }
      temp += String.fromCharCode(neu);
      }
   return temp;
}

function check(f){
   var pwd = f.elements["pass"].value;
   if (codeschutz_encode(pwd, 1) == "hfifjn") {
      //"geheim"
      cookie_setzen("Login", "ok");
      location.href = "geheim.html";
   }
}
//--></script>
</head>
<body>
<h1>Passwortabfrage</h1>

<form onsubmit="check(this); return false;">
   <input type="password" name="pass" />
   <input type="submit" value="Login" />
</form>
</body>
</html>

Die Datei geheim.html (und alle anderen, geschützten Seiten) müssen dann den folgenden Code enthalten, der überprüft, ob der Cookie gesetzt ist. Falls nicht, wird der Benutzer auf eine Fehlerseite geschickt:

<html>
<head>
<title>Top Secret</title>
<script type="text/javascript"><!--
function cookie_lesen(name) {
   var i = document.cookie.indexOf(name + "=");
   var c = "";
   if (i > –1) {
      var ende = document.cookie.indexOf("; ",
                 i+name.length+1);
      if (ende == –1) {
         ende = document.cookie.length;
      }
      c = document.cookie.substring(i+name.length+1, ende);
   }
   return unescape(c);
}

if (cookie_lesen("Login") != "ok") {
   location.href = "fehler.html";
}
//--></script>
</head>
<body>
Geheime Inhalte ...
</body>
</html>

Die Datei fehler.html enthält eine Fehlermeldung. Sie ist hier nicht angeführt, da sie aus dem JavaScript-Blickwinkel nichts Neues bringt. Sie müssen die Datei also selbst erstellen und mit einer aussagekräftigen Fehlermeldung versehen.


Rheinwerk Computing

28.2.2 Mit Java  toptop

Wenn Sie das Passwort nicht im Klartext (oder nur schwach verschlüsselt, wie oben gesehen) im Quelltext unterbringen möchten, steht Ihnen eine (zugegebenermaßen etwas extravagante) Alternative zur Verfügung. Das Passwort wird in einem (unsichtbaren) Java-Applet gespeichert.

Wie Sie vielleicht wissen (etwa nach Lektüre von Kapitel 24), können Sie von JavaScript aus alle als public deklarierten Methoden eines Java-Applets aufrufen.

Sie benötigen also ein Java-Applet, das Folgendes erledigt:

gp  Es speichert das Passwort in einer Variablen.
gp  Es bietet eine Methode an, die eine Zeichenkette mit dem Passwort vergleicht und dementsprechend true oder false zurückliefert.

Die letztgenannte Methode wird dann vom JavaScript-Code aus aufgerufen. Liefert sie true zurück, wird der Cookie gesetzt (ansonsten nicht).

Beginnen wir mit dem Java-Applet. Wir werden es nicht en detail erläutern, schließlich halten Sie ein JavaScript-Buch in den Händen, kein Java-Buch. Mit Ihren JavaScript-Kenntnissen werden Sie aber nicht allzu viele Probleme haben, das Listing zu verstehen.

import java.applet.*;
import java.awt.*;
public class login extends Applet {
  private String passwort = "geheim"; // das Passwort
   public void paint(Graphics g) {
   }
   public boolean checkLogin(String versuch) {
      return (versuch.equals(passwort));
   }
}

Kompilieren Sie diese Java-Datei mit javac login.java, um die Datei login.class zu erhalten. Binden Sie dann das Applet in eine HTML-Seite ein. Mit JavaScript können Sie dann die Funktion checkLogin() aufrufen:

<html>
<head>
<title>Top Secret</title>
<script language="JavaScript"><!--
function cookie_setzen() {
   var anzParameter = cookie_setzen.arguments.length;
   var parameter = cookie_setzen.arguments;
   var name = parameter[0];
   var value = (anzParameter >= 2) ? parameter[1] : "";
   value = escape(value); // URL-Codierung
   var expires = (anzParameter >= 3) ? parameter[2] : null;
   if (expires != null) {
      if (expires.toGMTString) {
         expires = expires.toGMTString();
      }
   }
   var domain = (anzParameter >= 4) ? parameter[3] : null;
   var path = (anzParameter >= 5) ? parameter[4] : null;
   if (path != null) {
      path = escape(path); // Sonderzeichen umwandeln
   }
   var secure = (anzParameter >= 6) ? parameter[5] : null;
   var c = name + "=" + escape(value);
   if (expires != null) {
      c += "; expires=" + expires;
   }
   if (domain != null) {
      c += "; domain=" + domain;
   }
   if (path != null) {
      c += "; path=" + path;
   }
   if (secure) {
      c += "; secure";
   }
   document.cookie = c;
}
function check(f){
   var pwd = f.elements["pass"].value;
   var applet = document.loginApplet;
   if (applet && applet.checkLogin
              && applet.checkLogin(pwd)) {  // Passwort ok?!
      cookie_setzen("Login", "ok");
      location.href = "geheim.html";
   }
}
//--></script>
</head>
<body>
<h1>Passwortabfrage</h1>
<form onsubmit="check(this); return false;">
   <input type="password" name="pass" />
   <input type="submit" value="Login" />
</form>
<applet code="login.class" name="loginApplet"
        width="1" height="1"></applet>
</body>
</html>

Die Überprüfung, ob ein Cookie vorliegt, nehmen Sie dann auf den geschützten Seiten wie gehabt vor.

Damit haben Sie einen geschützten Bereich mit JavaScript erstellt, der aber wie folgt ausgehebelt werden kann:

gp  durch Deaktivierung von JavaScript
gp  durch manuelles Setzen des Cookies (was leider einfacher ist als man denkt)
 <<   zurück
  
  Zum Rheinwerk-Shop
Neuauflage: JavaScript
Neuauflage: JavaScript
bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: jQuery






 jQuery


Zum Rheinwerk-Shop: Einstieg in JavaScript






 Einstieg in JavaScript


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Suchmaschinen-Optimierung






 Suchmaschinen-
 Optimierung


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern