28.2 Seiten mit Cookies schützen  
Um eine Seite mit JavaScript-Mitteln vor unbefugtem Zugriff zu schützen, gibt es prinzipiell zwei Möglichkeiten:
|
Die Seite wird vollständig von JavaScript erzeugt. |
|
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.
28.2.1 Passwort im Quelltext  
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:
|
Mit cookie_lesen() lesen Sie den Wert eines Cookies aus. |
|
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.
28.2.2 Mit Java  
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:
|
Es speichert das Passwort in einer Variablen. |
|
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:
|
durch Deaktivierung von JavaScript |
|
durch manuelles Setzen des Cookies (was leider einfacher ist als man denkt) |
|