vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbacknächstes Kapitel


Tag 14

Komplexe Komponenten: Benutzeranmeldungen

Bisher fehlte immer irgend etwas. Sie haben erfahren, wie man interaktive Sites und verschiedene andere datenbankgestützte Sites erstellt, aber es gibt ein Thema, das noch nicht angesprochen wurde - Benutzeranmeldungen. Wie oft waren Sie schon auf einer Website und wurden aufgefordert, ein Benutzerprofil anzulegen oder sich anzumelden, bevor Sie irgendwelche Funktionen nutzen konnten? Die Möglichkeit festzustellen, um wen es sich bei einem Benutzer handelt, wenn er sich auf einer Website bewegt, ist unabdingbar, um wirklich personalisierte interaktive Dienste anzubieten.

UltraDev stellt ein eigenes Authentifizierungssystem bereit, aber um besser zu verstehen, wie und warum es funktioniert, konzentriert sich dieses Kapitel darauf, ein ähnliches System manuell anzulegen. Heute geht es um die folgenden Themen:

14.1 Anmeldesysteme

Es gibt mehrere Möglichkeiten, Anmeldesysteme für eine Website zu verwalten - abhängig davon, welche Zielsetzungen Ihre Site verfolgt. Wenn Sie eine sehr sichere Site brauchen, die alle Benutzer beobachtet, brauchen Sie eine Sitzungsüberwachung. Andernfalls kommen Sie möglicherweise auch mit einer der weniger sicheren Methoden zurecht.

HTTP-Authentifizierung

Mithilfe der grundlegenden Authentifizierungsfunktionen des HTTP-Protokolls können Sie einen einfachen Dialog für die Eingabe des Benutzernamens und eines Kennworts anzeigen und die Information für Ihre Website abfragen. Diese Prozedur verwendet jedoch den standardmäßig vom Browser definierten Authentifizierungsdialog und bietet keinerlei Flexibilität, die Oberfläche selbst zu gestalten.

In der Regel können Sie diese Form der Authentifizierung mithilfe der grundlegenden Konfigurationswerkzeuge Ihres Web-Servers einrichten, ohne dass irgendeine Interaktion in UltraDev erforderlich wäre. Ich verwende diesen Ansatz jedoch nur selten als hauptsächliche Authentifizierung auf einer Website. Statt dessen wird sie häufig eingesetzt, um begrenzten Zugriff auf bestimmte Bereiche einer Website bereitzustellen, wie beispielsweise Werkzeuge für die Administration. Weil die Funktionalität der Authentifizierung auf Serverebene bereitgestellt werden kann, müssen Sie an Ihrem existierenden Code keinerlei Änderungen vornehmen, damit sie funktioniert. Sie teilen dem Server einfach mit, welches Verzeichnis geschützt werden soll und welche Benutzername/Kennwort-Kombinationen Zugriff auf dieses Verzeichnis erhalten sollen.

Web-basierte Anmeldung

Eine Web-basierte Anmeldung bietet die größte Kontrolle darüber, wie die Benutzer Ihre Site nutzen können. Durch die Bereitstellung eines HTML-basierten Anmeldebildschirms kann das System einen guten Benutzer von einem bösen Benutzer unterscheiden und ihm abhängig von seinem Status erlauben, weiter mit dem System zu arbeiten.

Nehmen Sie beispielsweise an, Sie wollen eine Site anlegen, auf der mehrere Benutzer auf einen bestimmten Bereich zugreifen können, wobei das System jedoch nicht zu unterscheiden braucht, um wen es sich bei diesen Benutzern handelt - es muss nur überprüfen, ob sich diese Benutzer am System angemeldet haben. In diesem besonderen Fall muss nur ein Bildschirm bereitgestellt werden, der ungültige Anmeldungen zurückweist und zugelassenen Benutzern den Zugang erlaubt.

Darüber hinaus muss jede folgende, privilegierte Seite ebenfalls Code beinhalten, der überprüft, ob sich ein Benutzer korrekt angemeldet hat. Andernfalls könnten nicht berechtigte Benutzer einfach eine URL hinter dem Anmeldebildschirm erraten und auf die zugehörige Seite zugreifen - unabhängig von der Existenz des Anmeldebildschirms.

Bei der zweiten Methode, HTML-basierte Anmeldungen zu verarbeiten, werden die Benutzerinformationen wie bei der ersten Methode ausgewertet. Statt dann jedoch einfach die Information »Ja, diese Person besitzt die Zugriffsberechtigung« an andere Webseiten weiterzugeben, sendet der Server einen Bezeichner, der die Person, die sich durch die Webseite bewegt, eindeutig identifiziert. Auf diese Weise können Sie eine Website entwickeln, die um den Benutzer herum aufgebaut wird und sich an den Benutzer anpasst, statt von dem Benutzer zu verlangen, die Website bei jedem Zugriff für seine Bedürfnisse neu zu konfigurieren.

Betrachten wir das Beispiel eines Kaufhauses, wo Sie unter Verwendung Ihrer Kreditkarte Artikel aus einem Online-Katalog bestellen können. Für mich ist express.com die Verkörperung dieses Kaufhauses - eine E-Commerce-Site, wo fast jede DVD der Welt auf Lager ist. Wenn ich meinen regelmäßigen Besuch auf der Seite absolviere, dann will ich nicht jedes Mal die Liefer- oder Rechnungsinformationen neu eingeben. Statt dessen soll sich das System merken, wer ich bin - sodass ich einkaufen kann, ohne erst meine Kreditkarte suchen und Formulare ausfüllen zu müssen.

Das System, das von express.com und anderen Sites eingesetzt wird, ermöglicht mir, einen Benutzernamen und ein Kennwort anzugeben, die meine Kontoinformationen zu jedem Zeitpunkt identifizieren. Und das ist sehr viel praktischer, als die Information immer wieder aufs Neue eingeben zu müssen.

Diese Methode zur Verwaltung von Anmeldungen ist zwar sehr leistungsfähig, aber leider auch sehr schwierig zu implementieren - man muss die Informationen über den Benutzer verfolgen, während er angemeldet ist. Wenn Sie einen einfachen »Merken Sie sich mich«- Dienst anbieten, wie es ihn bei express.com gibt, dann müssen Sie sich nicht darum kümmern, wie der Benutzer sich zwischen den verschiedenen Seiten bewegt. Sie fordern einfach den Benutzernamen und das Kennwort an, ermitteln die zugehörige Information aus der Datenbank und zeigen sie auf dem nächsten Bildschirm an. Das Problem dabei ist, dass Sie häufig wollen, dass sich die Benutzer anmelden, sobald sie auf die Site gelangen. Auf diese Weise können Sie auf Informationen über die Benutzer zugreifen (und gegebenenfalls Informationen speichern), während sie sich durch Ihre Site bewegen.

Die Frage lautet offensichtlich, wo hier anzufangen ist. Die Antwort ist ganz und gar nicht einfach. Die erste Variation eines Anmeldesystems ist extrem einfach. Von dort aus bauen wir auf diesem System auf, bis wir etwas haben, was fast überall funktioniert.

Weil es zwei Arten anmeldungsbasierter Systeme (sicher und nicht sicher) gibt, tun wir unser Bestes, auf unseren Websites so sicher wie möglich zu sein. Auf Sites beispielsweise, die Informationen aus einer Datenbank laden können, wird die sensible Information nur im Bedarfsfall benutzt. Auf Seiten, die keine gesteigerte Sicherheit benötigen, sind die Anmeldetechniken lockerer. Darüber hinaus verwenden wir eine kleine »selbst gemachte« Authentifizierung, ebenso wie die Verhalten, die UltraDev für die Benutzerauthentifizierung bereitstellt. Machen Sie sich keine Gedanken - Sie werden es verstehen, wenn Sie es erst einmal probiert haben. Zunächst betrachten wir, wie ein Authentifizierungssystem manuell angelegt werden kann.

14.2 Das SQL

Das SQL, das Sie für ein System zur Benutzerauthentifizierung benötigen, ist trivial. Sie legen Ihre grundlegenden Benutzerinformationen in einer Tabelle ab und speichern zusätzliche Informationen in einer separaten Tabelle. Wenn Sie diese Struktur verwenden, brauchen Sie die Benutzerauthentifizierung nur einmal einzurichten und können sie unverändert an jeder anderen Stelle verwenden.

Fangen wir an. Welche Informationen brauchen Sie in Ihrer Tabelle für die Benutzerauthentifizierung? Nur ein paar wenige Dinge:

Der Benutzername und das Kennwort müssen nicht weiter beschrieben werden. Die Benutzer-ID wird benötigt, um einen einfachen Schlüssel bereitzustellen, mit dem festgestellt werden kann, ob ein Datensatz eindeutig ist. Sie könnten natürlich auch Benutzername und Kennwort kombinieren, um einen Primärschlüssel daraus zu bilden, aber wie Sie wissen, kommt UltraDev mit dieser Information nicht gut zurecht.

Eine Tabelle, die diese Authentifizierung unterstützt, könnte wie folgt aussehen:

create table tblUser (
userID varchar(50) not null,
username varchar(50),
password varchar(50),
primary key (userID)
)

Diese Tabelle weist ein kleines Problem auf, aber sie funktioniert so, wie sie hier gezeigt ist. Wo also liegt das Problem? Das Problem ist die Sicherheit.

Wie oft haben Sie schon gehört, dass die Sicherheit einer Website verletzt wurde und Tausende von Kreditkartennummern der Benutzer im Web offen abgerufen werden können? Die Tabelle könnte auch wie folgt aussehen:

create table tblUser (
userID varchar(50) not null,
username varchar(50),
password varchar(50),
creditcard varchar(50),
primary key (userID)
)

Das Einfügen eines Feldes für die Kreditkartennummer könnte schon ein Hinweis auf das Problem sein. Das Speichern sensibler Daten in einer Datenbank ist immer ein potenzielles Risiko. Offensichtlich braucht man kein Kreditkartenfeld in der Tabelle, aber das Speichern des Kennworts in der Tabelle ist fast genau dasselbe.

Wenn das Kennwort des Benutzers als Klartext in der Datenbank abgelegt und die Datenbank geknackt wird, könnte die in diesem Datensatz abgelegte Information offengelegt werden. Diese Information muss geschützt werden. Wenn Sie je ein Unternehmen angerufen haben, um sich nach Ihrem Kennwort zu erkundigen, und man dort in der Lage war, es für Sie nachzuschlagen, sollte das für Sie ein Warnsignal sein! Informationen, die zu Ihrem unverschlüsselten Kennwort gespeichert werden sollen, sollten höchstens eine Formulierung sein, die Sie an Ihr Kennwort erinnern.

Kennwörter sollten niemals als Klartext abgelegt werden, wenn eine Applikation sicher sein soll. Das Konto eines Benutzers könnte zwar ausspioniert werden, wenn sein Kennwort erraten wird, aber die Datenbank bleibt sicher, falls die gesamte Tabelle mit den Anmeldeinformationen versehentlich sichtbar gemacht wird.

Wie wird das Kennwortfeld geschützt? Es gibt zwei Methoden: entweder über eine im Datenbanksystem eingebaute Funktion oder durch die Entwicklung einer gespeicherten Prozedur auf dem Datenbankserver.

MySQL unterstützt eine spezielle Funktion, die die Codierung von Kennwörtern und anderen sensiblen Informationen übernimmt. Die Funktion password verschlüsselt alle ihr übergebenen Informationen in etwas, was von einem Benutzer nicht wieder entschlüsselt werden kann. Für eine Produktions-Website ist es wahrscheinlich am besten, eine kommerziell anerkannte Verschlüsselung für das Kennwort einzusetzen. Für unsere Zwecke ist die Funktion password jedoch auf alle Fälle ausreichend.

Eine Frage, die Ihnen vielleicht die ganze Zeit schon im Kopf herumspukt, ist: »Wie um alles in der Welt soll man prüfen, ob das vom Benutzer eingegebene Kennwort korrekt ist, wenn das Feld, mit dem es verglichen werden soll, verschlüsselt ist?« Die Antwort ist einfach. Bevor das Kennwortfeld mit dem vom Benutzer eingegebenen Wert verglichen wird, müssen Sie den eingegebenen Wert ebenfalls verschlüsseln. Sind die beiden Werte gleich, ist das Kennwort korrekt.

Das Einfügen von Datensätzen in MySQL unter Verwendung der Funktion password ist nur ein wenig schwieriger als andere Informationstypen einzufügen. Um beispielsweise einen Datensatz für mich in die Tabelle einzutragen, führe ich den folgenden Befehl aus:

insert into tblUser values (password('jray'+'mypass'),'jray',
password('mypass'));

Die Funktion password nimmt als Argument die zu verschlüsselnde Zeichenkette entgegen. Beachten Sie, dass die Benutzer-ID auf eine verschlüsselte Version aus Name und Kennwort des Benutzers gesetzt wird. Dabei handelt es sich lediglich um meine Methode, dieses Feld zu implementieren - Sie können selbstverständlich jede andere Technik verwenden, vorausgesetzt, sie ergibt einen eindeutigen Wert.

Es gibt zwei Möglichkeiten, die Datenbank nach einem Benutzer abzufragen, wenn die ID auf der Verschlüsselung von Benutzername und Kennwort basiert:

mysql> select * from tblUser where userID=password('jray'+'mypass');
+------------------+----------+------------------+
| userID | username | password |
+------------------+----------+------------------+
| 606717756665bce6 | jray | 3c7d536348b7ba98 |
+------------------+----------+------------------+
1 row in set (0.00 sec)

Die Verwendung der Definition von userID zur Auswahl des Benutzerdatensatzes ist unter einer Bedingung akzeptabel - der Benutzer darf sein Kennwort niemals ändern. Wenn der Benutzer sein Kennwort ändern darf und später versucht, auf sein Konto zuzugreifen, ist das Ergebnis eine leere Menge, weil die ID sich während der Lebensdauer des Datensatzes nicht ändern darf.

Selbst wenn dieser Ansatz attraktiv erscheint (es muss nur eine einzige Bedingung überprüft werden), stellt er nicht die korrekte Vorgehensweise dar. Die richtige Methode, einen Datensatz auszuwählen, ist ein Vergleich sowohl des Benutzernamens als auch des Kennworts mit den Werten in der Tabelle:

mysql> select * from tblUser where username='jray' 
and password=password('mypass');
+------------------+----------+------------------+
| userID | username | password |
+------------------+----------+------------------+
| 606717756665bce6 | jray | 3c7d536348b7ba98 |
+------------------+----------+------------------+
1 row in set (0.15 sec)

Und genau so werden wir die Informationen in der Tabelle im restlichen Kapitel überprüfen.

In den weiteren Kapiteln dieses Buchs wird die Funktion password im Code nicht mehr verwendet, um die Kompatibilität zwischen Datenbanksystemen und das einfache Debugging sicherzustellen. Sie können die Funktion nach Bedarf einsetzen.

14.3 Eine einfache Anmeldung

Füllen Sie Ihre Datenbank mit ein paar Benutzerinformationen. Sie brauchen für den Anfang nur ein paar wenige Datensätze:

insert into tblUser values (password('jraymypass'),
=>;'jray',password('mypass'));
insert into tblUser values (password('jackdpass2'),
=>;'jackd',password('pass2'));
insert into tblUser values (password('robynpass3'),
=>;'robyn',password('pass3'));
insert into tblUser values (password('maddypass4'),
=>;'jray',password('pass4'));

Jetzt starten Sie UltraDev und richten einen Anmeldebildschirm ein:

  1. Legen Sie ein neues Projekt an.
  2. Richten Sie eine Verbindung zu der neuen Anmeldedatenbank (Login) ein.
  3. Erstellen Sie eine Standardanmeldeseite mit einem Formular für Benutzername und Kennwort.

Abbildung 14.1 zeigt eine einfache Anmeldeseite mit zwei Feldern und einer Senden- Schaltfläche. Ich habe die beiden Felder als Benutzername und Kennwort bezeichnet - Sie erkennen damit sicher, welchen Zweck sie erfüllen.

Abbildung 14.1:  Ein einfacher Anmeldebildschirm

Verwenden Sie für das Kennwortfeld unbedingt den Feldtyp password. Damit wird keine echte Serversicherheit unterstützt, aber es dient zwei Aufgaben. Erstens schützt es das Kennwort bei der Eingabe. Zweitens beruhigen Sie die Benutzer damit. Durch Verwendung des password-Stils für ein Feld erkennt der Benutzer, dass Sie die Daten als sensibel betrachten.

Mein Bildschirm wird durch den folgenden Code realisiert - wenn Sie möchten, übernehmen Sie ihn einfach:

1 <form name="loginForm">
2 <table width="100%" border="0" cellspacing="0" cellpadding="5">
3 <tr>
4 <td width="49%" bgcolor="#9999FF">
=>;<font face="Arial, Helvetica, sans-serif">
5 Benutzername: <input type="text" name="textfield">
6 </font></td>
7 <td width="40%" valign="middle" bgcolor="#9999FF">
8 <font face="Arial, Helvetica, sans-serif">
9 Kennwort:<input type="password" name="textfield2">
10 </font></td>
11 <td width="11%" valign="middle" bgcolor="#FFFF99">
12 <input type="submit" name="Submit" value="Anmelden">
13 </td>
14 </tr>
15 </table>
16 </form>

Die wesentlichen Inhalte des Formulars sehen Sie in den Zeilen 5 und 9. Dort werden der Benutzername und das Kennwort abgefragt. Das restliche Formular variiert abhängig davon, wie Sie Ihren Bildschirm gestaltet haben.

Aber wie melden Sie sich irgendwo an? Es ist gut und schön, ein Anmeldeformular zu haben, aber es muss auch irgendetwas tun!

Das von Ihnen angelegte Formular muss seine Daten zur Verarbeitung an eine Seite weitergeben. Für eine Änderung gibt es kein Serververhalten auf dieser Seite - sie soll einfach nur Daten an einen anderen Bereich des Programms weitergeben. Richten Sie Ihr Formular so ein, dass seine Aktion eine zweite Seite ist, verify.asp.

Verarbeitung der Anmeldeinformation

Legen Sie Ihre neue Seite an, verify.asp (oder was Sie für Ihr Servermodell brauchen). In Kapitel 13 haben Sie erfahren, wie mit der Methode Bereich anzeigen eine Funktionalität implementiert werden kann, die weit über die Anzeige der Schaltflächen Nächster und Vorheriger hinausgeht. Und genau diese werden wir heute nutzen, um die Anmeldung zu verarbeiten.

Aus der gestrigen Sitzung wissen Sie, dass der Schlüssel zur Verwendung des Verhaltens Bereich anzeigen die Definition einer Datensatzgruppe ist und dass das Verhalten von den Ergebnissen der Datensatzgruppenabfrage abhängig gemacht wird.

Um eine Datensatzgruppe für die Seite vorzubereiten, gehen Sie wie folgt vor:

  1. Öffnen Sie die Palette Serververhalten.
  2. Klicken Sie auf das Plussymbol (+) und wählen Sie Datensatzgruppe (Abfrage) aus.
  3. Gehen Sie in den erweiterten Modus, indem Sie auf die Schaltfläche Erweitert klicken.
  4. Fügen Sie die Variable varUser ein und verwenden Sie den Laufzeitwert 'Request("username")'.
  5. Fügen Sie die Variable varPass ein und verwenden Sie den Laufzeitwert 'Request("password")'.
  6. Anschließend fügen Sie die folgende SQL-Anweisung in das Dokument ein:
    SELECT *
    FROM tblUser
    WHERE username='varUser' AND password=password('varPass')

Wenn Sie Standardwerte für die beiden Variablen setzen, klicken Sie auf die Schaltfläche Testen, um zu überprüfen, ob die Abfrage funktioniert.

Die endgültige Konfiguration sollte etwa aussehen wie in Abbildung 14.2 gezeigt.

Und jetzt zum unterhaltsamen Teil - wir prüfen, ob die Anmeldeinformation korrekt war. Sie können sich vielleicht schon denken, wie wir das machen. Die Datensatzgruppe wurde so definiert, dass sie einen Datensatz ermittelt, der mit einem Benutzernamen und einem Kennwort übereinstimmt. Sind Benutzername oder Kennwort fehlerhaft, ist die Datensatzmenge leer.

Abbildung 14.2:  Definieren Sie Ihre Abfrage für die Überprüfung der Anmeldung wie hier gezeigt.

Abbildung 14.3:  Richten Sie innerhalb eines einzigen Formulars die Meldungen für die erfolgreiche und für die nicht erfolgreiche Anmeldung ein.

Um Ihr Dokument verify.asp so einzurichten, dass es Ihnen mitteilt, ob eine Anmeldung gültig war, müssen Sie den Inhalt für Ihre gültigen und ungültigen Anmeldungen definieren. Sie definieren diese Inhaltsbereiche direkt in dem einzigen Überprüfungsdokument.

Eine einfache Methode wäre, die beiden verschiedenen Szenarios in zwei Tabellen einzurichten. Abbildung 14.3 beispielsweise zeigt sowohl eine erfolgreiche als auch eine nicht erfolgreiche Anmeldung.

Nachdem Sie jetzt zwei Inhaltsbereiche auf Ihrem Bildschirm haben, richten Sie die Seite so ein, dass nur der jeweils zutreffende Bereich angezeigt wird, wenn der Benutzer versucht sich anzumelden. Das ist ganz einfach, indem Sie das Verhalten Bereich anzeigen abhängig vom Status der Datensatzgruppe festlegen.

Um die erfolgreiche Anmeldung anzuzeigen, gehen Sie wie folgt vor:

  1. Wählen Sie die Tabelle aus, die die Erfolgsmeldung enthält.
  2. Öffnen Sie die Palette Serververhalten.
  3. Klicken Sie auf das Plussymbol (+) und wählen Sie im Untermenü Bereich anzeigen die Option Bereich zeigen, wenn Datensatzgruppe nicht leer ist.
  4. Schließen Sie die zu überprüfende Datensatzgruppe.
  5. Klicken Sie auf OK, nachdem Sie fertig sind.

Abbildung 14.4 zeigt das Verhalten Bereich anzeigen.

Abbildung 14.4:  Die Meldung zur erfolgreichen Anmeldung soll nur dann angezeigt werden, wenn die Datensatzgruppe nicht leer ist.

Analog konfigurieren Sie die Meldung für die nicht erfolgreiche Anmeldung so, dass sie angezeigt wird, wenn die Datensatzgruppe leer ist. Weil die Datensatzgruppe nicht gleichzeitig leer und nicht leer sein kann, wird jeweils nur die geeignete Meldung angezeigt.

Testen

Nun testen Sie das Anmeldesystem. Übertragen Sie den Anmeldungs- und den Überprüfungsbildschirm auf Ihren Applikationsserver und testen Sie sie. Dazu überprüfen Sie alle Eingabemöglichkeiten, die in dem Formular auftreten können:

Sie sollten für alle Ihre Applikationen Tests durchführen, um sicherzustellen, dass sie in jeder Situation wie vorgesehen arbeiten. Beim Ausprobieren der verschiedenen Kombinationen werden Sie bemerken, dass Sie eine Erfolgsmeldung erhalten, wenn die Felder leer gelassen werden. Wenn dies passiert, liegt es fast immer an den Variablen, für die Sie Standardwerte definiert haben. Die Standardwerte werden in der Entwurfsansicht Live-Data nicht einfach verwendet - sie werden in den automatisch erzeugten Code übernommen. Setzen Sie die Standardwerte also auf einen nicht existierenden Benutzernamen bzw. ein nicht existierendes Kennwort, um das System vollständig zu sichern.

Seien Sie beim Setzen der Standardwerte für eine Abfrage vorsichtig! Wenn Sie Standardwerte für Testzwecke setzen und vergessen, diese auch wieder zu löschen, haben Sie damit vielleicht eine Hintertür in Ihr System geschaffen, ohne es zu wissen. Bei einem Anmeldesystem führt die Verwendung gültiger Benutzernamen und Kennwörter als Standardvariablenwerte zu einer Situation, wo überhaupt kein Kennwort und auch kein Benutzername angegeben werden müssen, um Zugriff auf geschützte Seiten zu erhalten.

Verborgener Code

Wie bereits in Kapitel 13 erwähnt, stellt das Verhalten Bereich anzeigen kein Sicherheitsrisiko dar, weil sie einen Bereich auf einer Seite nicht wirklich verbirgt oder unsichtbar macht. Statt nur bedingt alle Daten anzuzeigen, stellt man sich das Verhalten besser als Bereich löschen vor, der einen Bereich nicht löscht, wenn die entsprechende Bedingung erfüllt ist.

In der zuvor erstellten Applikation sieht die Seite zur Anzeige einer Erfolgsmeldung etwa so aus:

1 <html>
2 <head>
3 <title>Login</title>
4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5 </head>
6 <body bgcolor="#FFFFFF"
7 <table width="100%" border="0" cellspacing="0" cellpadding="0">
8 <tr align="center" bgcolor="#00FF00">
9 <td><font face="Arial, Helvetica, sans-serif" size="+2">
10 Sie haben sich erfolgreich angemeldet!</font></td>
11 </tr>
12 </table>
13 <br>
14 </body>
15 </html>

Analog sieht das HTML für die nicht erfolgreiche Anmeldung wie folgt aus:

1 <html>
2 <head>
3 <title>Untitled Document</title>
4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5 </head>
6 <body bgcolor="#FFFFFF">
7 <br>
8 <table width="100%" border="0" cellspacing="0" cellpadding="0">
9 <tr align="center" bgcolor="#FF0000">
10 <td><font face="Arial, Helvetica, sans-serif" size="+2">
11 Ihre Anmeldeinformation ist fehlerhaft.</font></td>
12 </tr>
13 </table>
14 </body>
15 </html>

Beim Vergleich der beiden Seiten bemerken Sie, dass nur die Tabelle, die auf dem Bildschirm angezeigt werden soll, im HTML enthalten ist. Das bedeutet, Sie können sensible Informationen auf dem Bildschirm für die erfolgreiche Anmeldung eintragen, ohne sich Gedanken darum machen zu müssen, dass sie in der HTML-Quelle erscheinen könnten.

14.4 Sitzungsverwaltung

Nachdem sich der Benutzer korrekt am System angemeldet hat, müssen seine Informationen verwaltet werden, während er sich auf den verschiedenen Seiten der Site bewegt. Es gibt zwei Möglichkeiten, die Identität eines Benutzers auf seinem Weg durch eine Website zu verwalten.

Erstens kann die Benutzer-ID als Teil der URL zwischen den einzelnen Seiten übergeben oder in ein Formular eingebettet werden. Diese Form der Sitzungsverwaltung ist praktisch, weil dafür keine Cookies benötigt werden, um einen Benutzer zu verfolgen. Sie werden es erleben, dass sich früher oder später jemand beschweren wird, wenn Sie eine Site implementieren, wo die Sitzungsverwaltung mithilfe von Cookies vorgenommen wird.

Der Nachteil bei diesem Ansatz ist, dass der Client den externen Computer ständig daran erinnert, wer er ist. Ohne die benutzerdefinierte Programmierung kann der Benutzer ein Lesezeichen auf eine Seite setzen, nachdem er sich am System angemeldet hat, und gelangt damit unmittelbar in den angemeldeten Status. (Das erscheint Ihnen vielleicht auf den ersten Blick als Vorteil.) Weil die Benutzer-ID, die zwischen Seiten übergeben wird, sich niemals ändert, gibt es keine Möglichkeit zu erkennen, ob sich der Benutzer tatsächlich neu am System angemeldet hat oder ob er nach einem früheren Versuch wieder zurückgekehrt ist.

Dieses Situation könnte man möglicherweise umgehen, indem man eine weitere Tabelle in der Datenbank anlegt, die eine zufällige Sitzungs-ID enthält, welche der Benutzer-ID bei der Anmeldung zugeordnet wird. Diese Sitzungs-ID kann dann anstelle der Benutzer- ID zwischen den einzelnen Seiten übergeben werden. Nach einer bestimmten Zeit oder nach einem bestimmten Ereignis (wenn der Benutzer beispielsweise auf die Schaltfläche Abmelden klickt) kann diese Sitzungs-ID entfernt werden, sodass der Benutzer definitiv abgemeldet ist.

Diese Komplexitätsebene bedarf einer zusätzlichen serverseitigen Programmierung, um die Sitzungs-ID zu entfernen. Es gibt eine alternative, weniger komplizierte Methode, mit derselben Situation zurechtzukommen. Wenn Sie Sitzungsinformationen in einem Cookie ablegen, übertragen Sie die schwierige Aufgabe, eine Sitzung zu beenden, dem Client-Computer.

Wenn sich der Benutzer zum ersten Mal am System anmeldet, können Sie einen Cookie auf seinem Computer ablegen. Dieses Cookie nimmt die Benutzer-ID auf. UltraDev ermöglicht Ihnen, mit den Cookies wie mit Variablen zu kommunizieren. Diese Technik ist einfach in der Anwendung und leicht zu verwalten - bis auf ein paar kleinere Probleme. Erstens muss der Benutzer die Cookies zulassen, sonst ist das Programm unnütz. Zweitens muss die Programmierung außerhalb der UltraDev-Umgebung stattfinden. UltraDev bietet keine Unterstützung für das Setzen von Cookies als Serververhalten.

Das letzte Problem ist, dass Cookies keinen echten Sicherheitsvorteil haben - obwohl sie größtenteils vor dem Benutzer verborgen sind, können sie von ihm gelesen und von erfahrenen Hackern auch verändert werden. Es ist kein größeres Problem, auf dem Client- Computer ein nie ablaufendes Cookie zu schaffen, das eine permanente Anmeldesitzung erlaubt.

Die beste Lösung in dieser Situation ist es, das Cookie zu nutzen, um dort eine zufällig erzeugte Sitzungs-ID zu speichern, und einzelne Benutzer anhand dieser Sitzungs-ID zu erkennen. Nach einer bestimmten Zeit kann der Server diese Sitzungs-ID entfernen. Sobald das passiert, ist das Cookie wertlos geworden, unabhängig davon, ob es bereits abgelaufen ist oder nicht.

Es besteht letztlich kaum ein Unterschied zwischen der Verwendung von Cookies und der Informationsübergabe von URL zu URL. Cookies sind vom Standpunkt des Benutzers aus transparenter, aber sie sind weniger kompatibel als die Übergabe im URL-Parameter.

Welche Technik verwenden wir also hier? Wir nutzen eine Kombination der Techniken, um den Status zu verwalten. Ich persönlich vermeide Cookies wo immer möglich. Die Gefahr, Kunden auf einer Website zu verlieren, weil sie keine Cookies zulassen, ist das Risiko nicht wert. Sicherlich gibt es Situationen, wo dies keine besondere Bedeutung hat, aber wenn Sie versuchen, so viele Benutzer wie möglich zu erreichen, sollten Sie so wenige Cookies wie möglich verwenden.

Verstehen Sie mich nicht falsch - Cookies sind ein wunderbares Werkzeug! Sie können jedoch nicht davon ausgehen, dass alle Benutzer die von Ihnen gesetzten Cookies auch akzeptieren. Ich empfehle Ihnen nicht, Cookies für Sites zu verwenden, die sich an ein großes Publikum richten, aber sie sind äußerst wertvoll, wenn Sie steuern können, welche Benutzer auf die Site zugreifen. Ich verwende Cookies beispielsweise, um Statusinformationen in Intranets zu verwalten.

Wenn Sie einmal erleben wollen, wie oft im Web Cookies verwendet werden, legen Sie in den Einstellungen Ihres Browsers fest, dass er Sie jedes Mal warnen soll, wenn ein Cookie gesetzt wird. Sie werden erstaunt sein!

Variablenübergabe

Jetzt implementieren wir die Sitzungsverwaltung durch Übergabe von URL-Parametern. Dazu ist ein relativ geringer Aufwand erforderlich. Sie brauchen jedoch ein neues Serververhalten, damit Sie dieses Funktionsmerkmal auf der gesamten Site nutzen können.

Öffnen Sie das UltraDev-Dokument Verify, das sowohl die gültigen als auch die ungültigen Bereiche enthält. Der Bereich, mit dem Sie arbeiten wollen, ist der gültige Bereich. Um der restlichen Site mitzuteilen, wer wir sind, müssen wir einen Hyperlink von diesem Bereich zur nächsten Seite einer gültigen Anmeldung setzen.

Als Erstes legen Sie eine Platzhalterseite für die restliche Site an. Diese Seite braucht noch keinen Inhalt zu haben; es handelt sich nur um den Bereich, für den Sie nach einer gültigen Anmeldung einen Hyperlink einfügen. Ich nenne meine Seite online.asp - vielleicht wollen Sie ja meiner Namenskonvention folgen.

Nachdem Sie die Seite hinzugefügt haben, gehen Sie zurück auf die Seite verify.asp. Hier legen Sie den Hyperlink für die Parameterübergabe an. Gehen Sie wie folgt vor, um auf das Dokument online.asp zu verweisen, wenn die Benutzer-ID übergeben wird:

  1. Fügen Sie ein neues Objekt oder eine Textmarke in den gültigen Bereich ein. Für dieses Objekt wird die Verknüpfung erstellt.
  2. Markieren Sie das Objekt, und wählen Sie im Menü Modifizieren die Option Link erstellen.
  3. Wählen Sie die Datei online.asp, die Sie eben angelegt haben. Sie steht für die restliche Site.
  4. Klicken Sie auf die Schaltfläche Parameter. Sie müssen der Link-Zeile einen dynamischen Parameter hinzufügen.
  5. Fügen Sie einen neuen Parameter ein, mit dem die Benutzer-ID übergeben wird. Abbildung 14.5 zeigt, dass ich diesem Parameter den Namen userID gegeben habe.
  6. Um den Wert für den Parameter zu setzen, klicken Sie auf das Icon mit dem Blitz im Feld Wert.
  7. Wählen Sie das Feld userID aus der Datensatzgruppe und klicken Sie auf OK.
  8. Ihr dynamischer URL-Parameter soll dem Link-Konfigurationsdialog hinzugefügt werden, wie in Abbildung 14.6 gezeigt.

    Abbildung 14.5:  Fügen Sie einen neuen Parameter ein, der die Benutzer-ID übergibt.

    Abbildung 14.6:  Der dynamische Parameter wird am Ende Ihres Links eingefügt.

Das sollte reichen. Wenn der Benutzer jetzt auf den Hyperlink klickt, um auf die restliche Site zuzugreifen, wird seine Benutzer-ID über den Hyperlink an die nächste Seite übergeben. Dieser Parameter kann auf der nächsten Seite verwendet werden, um Konteninformationen nachzuschlagen oder zu speichern usw.

Es gibt ein Serververhalten, das genau dafür ausgelegt ist, Hyperlinks zu anderen Seiten anzulegen, während alle existierenden URL- und Formularparameter übergeben werden. Für diesen ersten Link müssen wir die Parameterübergabe manuell definieren, weil der Wert noch nicht als URL-Parameter oder Formularelement existiert.

Nun testen Sie die Seite. Wenn Sie sich mit einem gültigen Benutzernamen und Kennwort anmelden, enthält der Link auf die neue Site-Seite den URL-Parameter, den Sie übergeben wollen:

http://192.168.0.150/login/online.asp?userID=606717756665bce6

Falls Sie eine weitere Bestätigung brauchen, dass dies funktioniert, fügen Sie eine neue Datenssatzgruppe auf der online-Seite ein, die eine Abfrage ausführt, um die restlichen Informationen (Benutzername/verschlüsseltes Kennwort) aus der Benutzertabelle abzurufen und auf der Webseite anzuzeigen.

Sie kennen die Prozedur bereits:

  1. Öffnen Sie das Dokument online.asp.
  2. Öffnen Sie die Palette Serververhalten.
  3. Klicken Sie auf das Plussymbol (+) und wählen Sie im Popup-Menü den Eintrag Datensatzgruppe (Abfrage).
  4. Klicken Sie im erweiterten Modus des Definitionsfensters für die Datensatzgruppen auf Einfach, um in die einfache Ansicht zurückzugelangen.
  5. Wählen Sie die entsprechende Verbindung und Tabelle aus den Popup-Menüs.
  6. Übernehmen Sie die Standardvorgaben für die anderen Optionen, außer für Filter. Setzen Sie einen Filter für die Abfrage, die die Benutzer-ID in der Datenbank mit der Benutzer-ID im URL-Parameter vergleicht.
  7. Nachdem Ihre Datensatzgruppe vollständig ist (sie sollte ähnlich wie in Abbildung 14.7 aussehen), klicken Sie auf die Schaltfläche OK.

Jetzt gehen Sie auf die Palette Datenbindungen und ziehen die Felder für Benutzernamen und Kennwort aus Ihrer Datensatzgruppe in die Entwurfsansicht. Testen Sie Ihr Dokument erneut und überprüfen Sie, ob die korrekte Benutzerinformation angezeigt wird.

Die Seite scheint jetzt komplett zu sein, aber leider bleibt noch ein bisschen Arbeit zu tun. Einfache Arbeit, aber Arbeit.

Es gibt ein ernsthaftes Problem in unserem System. Versuchen Sie sich ein bisschen auf den Seiten zu bewegen, und beobachten Sie, was passiert. Wenn Sie dem logischen Fluss durch Ihre Site folgen, werden Sie feststellen, dass alles perfekt funktioniert. Das ist jedoch völlig von der vorgesehenen Seitenlogik abhängig. Stellen Sie sich jetzt vor, Sie seien ein Hacker - folgt ein Hacker immer dem logischen Fluss, den Sie für Ihre Seite definiert haben? Natürlich nicht! Um das Problem zu erkennen, überspringen Sie den Anmeldebildschirm und laden Sie die Seite online.asp direkt in Ihren Browser.

Abbildung 14.7:  Um die Anmeldeinformation zu überprüfen, legen Sie eine Datensatzgruppe an, um die Benutzerinformation abhängig von dem übergebenen URL-Parameter auszuwählen.

Sehen Sie jetzt, wo das Problem liegt?

Sie haben auf die »sichere« Webseite zugegriffen, ohne auch nur irgendeine Anmeldeinformation einzugeben. Und genau das wollten wir doch nicht!

Glücklicherweise wissen Sie bereits, wie man dieses Problem korrigiert - mithilfe des Serververhaltens Bereich anzeigen. Sie haben bereits eine Datensatzgruppe für die Seite definiert, die Sie in Ihrem Verhalten Bereich anzeigen verwenden können:

  1. Markieren Sie die gesamte Webseite.
  2. Öffnen Sie die Palette Serververhalten.
  3. Klicken Sie auf das Plussymbol (+), und wählen Sie das Menü Bereich anzeigen aus. Wählen Sie Bereich anzeigen, wenn Datensatzgruppe nicht leer ist aus dem Untermenü.
  4. Wählen Sie die erstellte Datensatzgruppe aus.
  5. Klicken Sie auf OK, um die Konfiguration zu speichern.

Sie sollten nicht nur einfach den Seiteninhalt verbergen, sodass er nicht sichtbar ist, wenn der Benutzer nicht angemeldet ist, sondern vielleicht auch eine Warnmeldung ausgeben. Sie könnten der Seite beispielsweise den Bereich Ungültiger Zugriff hinzufügen, der angezeigt wird, wenn die Datensatzgruppe leer ist. Auf diese Weise wird der Seiteninhalt korrekt angemeldeten Benutzern angezeigt, während Benutzer, die versucht haben, das Sicherheitssystem zu umgehen, nur eine Warnmeldung erhalten.

Sie sollten das Verhalten Bereich anzeigen auf allen Seiten verwenden, die nicht der allgemeinen Öffentlichkeit angezeigt werden sollen. In einigen Fällen ist es egal, ob Leute auf datenbankgestützte Seiten zugreifen, ohne sich anzumelden, weil dort keine sensiblen Daten existieren. (Es gibt beispielsweise keine Möglichkeit, die Benutzer-ID ohne korrekte Anmeldung anzuzeigen.) Je weniger Informationen jedoch einem potentiellen Hacker zur Verfügung stehen, desto besser ist es.

Variablenübergabe - Fortsetzung

Jetzt können Sie Ihre restlichen Seiten einrichten, sodass sie auch an den Kennwortdialog angeschlossen und dahinter verborgen werden. Die Technik, die Sie für die Verknüpfung der userID von einer Seite zur nächsten kennen gelernt haben, funktioniert für beliebige Seiten. Sie müssen nur daran denken, dass Sie diese Information zwischen den Seiten übertragen müssen. Wenn sie nicht übertragen wird, vergisst die Site, um wen es sich bei dem Benutzer handelt.

Diese einfachen Schritte können an beliebiger Stelle angewendet werden, um eine bestimmte Variable (wie beispielsweise eine userID) zwischen Seiten zu übertragen:

  1. Wählen Sie das Objekt aus, das für den Hyperlink verwendet werden soll.
  2. Wählen Sie im Menü Modifizieren den Eintrag Link erstellen.
  3. Suchen Sie nach der Datei, mit der Sie eine Verknüpfung einrichten wollen, und wählen Sie sie aus.
  4. Klicken Sie auf die Schaltfläche Parameter.
  5. Fügen Sie den Namen des neuen Parameters ein, den Sie übertragen wollen.
  6. Statt einen Wert für den Parameter bereitzustellen, klicken Sie auf das Blitzsymbol.
  7. Wählen Sie das zu übertragende Feld aus den verfügbaren Datensatzgruppen aus.
  8. Klicken Sie auf OK.

Sie werden es nicht mögen. Nicht ein bisschen. Vielleicht werden Sie schreien. Hassen Sie mich nicht!

Um die erforderliche Statusinformation zu verwalten, müssen Sie für jeden angelegten Hyperlink URL-Parameter übergeben. Wenn Sie beispielsweise eine Site-Übersicht haben, die Links zu 100 oder mehr Seiten auf Ihrer Site enthält, müssen Sie all diesen Hyperlinks die entsprechenden URL-Parameter hinzufügen. Das kann zu größerem Kopfzerbrechen führen, aber es ist die einzige Methode (außer der Verwendung von Cookies), die benötigten Daten zu übertragen.

Machen Sie sich nicht zu viele Sorgen - wir probieren hier gerade die harte Methode aus. Betrachten Sie es als Lernprozess.

Es gibt zwei Alternativen, die die Übertragung von URL-Parametern beschleunigen können. Die erste setzt voraus, dass Sie bereits eine URL mit einem dynamischen Parameter definiert haben, wie oben beschrieben, und dass Sie für alle Links im Dokument denselben Parameter definieren wollen.

Hier sehen Sie die Tabelle Valid Login (Gültige Anmeldung), die ich unmittelbar nach der Anmeldung am Server anzeige:

1 <table width="100%" border="0" cellspacing="0" cellpadding="0">
2 <tr align="center" bgcolor="#00FF00">
3 <td>
4 <p><font face="Arial, Helvetica, sans-serif" size="+2">Sie haben sich
5 erfolgreich angemeldet!</font></p>
6 <p><font face="Arial, Helvetica, sans-serif" size="+2">
7 <a href="online.asp?userID=<%=
=>;(rsUsr.Fields.Item("userID").Value)%>">CONTINUE</a>
8 </font>
9 </p>
10 </td>
11 </tr>
12 </table>

Betrachten Sie den Code in der Nähe des Links CONTINUE - in Zeile 7 ist der HTML- (und ASP-Code-)Abschnitt, der den URL-Parameter überträgt:

?userID=<%=(rsUser.Fields.Item("userID").Value)%>

Wenn Sie denselben URL-Parameter ganz schnell all Ihren anderen Links (auf derselben Seite) hinzufügen wollen, dann machen Sie das einfach am Ende all Ihrer URLs.

Um sich das Leben ein bisschen leichter zu machen, verwenden Sie die Suchen-und-Ersetzen-Funktionen von UltraDev, um am Ende aller Links auf Ihren Seiten den URL-Parameter einzufügen. Sie müssen einen regulären Ausdruck definieren, der den Links entspricht, aber am besten machen Sie es manuell.

Auf eine Seite mit ergänzenden Themen wechseln

Eine Alternative zur Übertragung von URL-Parametern zwischen Seiten ist die Verwendung eines Serververhaltens. Das ist nicht wirklich schneller als die Verwendung eines dynamischen Parameters für einen Link, wenn Sie nur einen einzigen Parameter übertragen. Praktisch wird es, wenn Sie mehrere Parameter übertragen müssen, beispielsweise wenn Sie ein Formular an eine Seite gesendet haben und dann alle Variablen an eine andere Seite weitergeben wollen. Dazu könnten Sie ein paar Dutzend dynamischer URL-Parameter für die Übertragung einrichten.

Sie können aber auch das Serververhalten Zu Seite mit ergänzenden Themen wechseln einsetzen, das alle aktuell auf einer Seite existierenden Parameter sowie alle von einem Formular übergebenen Informationen überträgt. Im Wesentlichen können alle auf einer Webseite verfügbaren Daten mithilfe dieses Verhaltens an eine andere Seite übertragen werden.

Um das Verhalten Zu Seite mit ergänzenden Themen wechseln nutzen zu können, wählen Sie das Objekt aus, das als Link dienen soll und dann in der Palette Serververhalten den Eintrag Zu Seite mit ergänzenden Themen wechseln aus. Tragen Sie die Seite, zu der Sie den Link einrichten, ein oder wählen Sie sie aus, und geben Sie an, welche Parameter übertragen werden sollen.

Sie können angeben, dass URL- und Formularparameter an die Seite mit den verwandten Themen übertragen werden sollen. Die URL-Parameter sind die Optionen, die in der URL-Zeile übergeben werden, wie beispielsweise

http://www.myurlgoeshere.com/test.asp?name=John

Dabei wird der Parameter name mit dem Wert John übergeben.

Der zweite Parametertyp, den Sie übergeben können, sind die Formularparameter. Dies sind die Variablen, die beim Senden eines Formulars erzeugt werden. Falls die Seite, auf der Sie sich befinden, nur das Ergebnis einer Formularübertragung ist, können Sie die gesendeten Informationen an eine andere Seite weitergeben, indem Sie auf diese Option klicken.

Abbildung 14.8 zeigt die Definition des Serververhaltens Zu Seite mit ergänzenden Themen wechseln.

Abbildung 14.8:  Wählen Sie die Seite, der Sie bereits existierende Parameter übergeben wollen.

Sie sind vielleicht überrascht zu hören, dass wir noch keine Webseiten erstellt haben, die dieses Verhalten nutzen! Der offensichtlichste Verwendungszweck ist unmittelbar nach der Benutzeranmeldung, um die Benutzer-ID an alle nachfolgenden Seiten weiterzugeben. Leider existiert die Benutzer-ID an dieser Stelle noch nicht als URL- oder Formularparameter.

Dies ist für Anfänger immer schwer zu verstehen. Beachten Sie, dass die Inhalte einer Datensatzgruppe nicht Teil der URL- oder Formularparameter sind. Sie stehen zwar zur Verarbeitung auf einer Seite zur Verfügung, so wie Formular- oder URL-Parameter, aber es handelt sich dabei um etwas ganz anderes.

Erst nachdem Sie die Benutzer-ID manuell an eine Seite übergeben haben, können Sie das Verhalten Zu Seite mit ergänzenden Themen wechseln nutzen, um den Wert an weitere Seiten weiterzugeben.

14.5 Cookies

Zum Abschluss dieses Kapitels betrachten wir, wie mithilfe von Cookies Benutzerinformationen verwaltet werden. Das ist nicht gerade das bestintegrierte Funktionsmerkmal von UltraDev, deshalb erledigen wir alles, was möglich ist, in UltraDev, und verlassen es dort, wo es nötig wird.

Bisher haben wir eine relativ einfache Methode kennen gelernt, Informationen über die aktuell angemeldeten Benutzer zu verwalten, aber dabei müssen sehr viele Daten über die URL übergeben werden. Die Verwendung von Cookies für dieselbe Aufgabenstellung erledigt dasselbe, ist einfacher und Sie können Cookies für jeweils ganze Projekte erstellen - nicht nur für eine einzige Seite.

Wir werden jetzt einen komplexeren Verwendungszweck für Cookies betrachten - Sitzungsvariablen. Eine Sitzungsvariable ist kein Cookie, benötigt jedoch für ihre Arbeit ein Cookie. Eine Sitzungsvariable speichert abhängig von der in einem Cookie abgelegen Sitzungs-ID einen bestimmten Informationsabschnitt. Praktisch dabei ist, dass das Cookie, das auf dem Client-Computer gesetzt wurde, nur eine zufällig erzeugte Sitzungs-ID enthält - dies ist die einzige Information, die auf dem Client abgelegt ist. Die Sitzungs-ID wird verwendet, um andere Sitzungswerte zu identifizieren, die auf dem Server gespeichert sind. Das bedeutet, es entsteht kein Sicherheitsproblem, wenn Daten zwischen dem Server und dem Client übertragen werden.

Wie wir bereits erwähnt haben, kann die Verwendung von Cookies leider die Benutzer stören oder einfach nicht funktionieren, wenn die Benutzer die Cookies auf ihren Computern deaktiviert haben. Abbildung 14.9 zeigt ein typisches Dialogfeld, das bei der Übertragung eines Cookies angezeigt wird.

Abbildung 14.9:  Cookies können nerven.

Wenn Sie vorhaben, eine Cookie-gestützte Site anzulegen, sollten Sie irgendwo auf der Site eine Erklärung unterbringen, sodass die Benutzer verstehen, wie und warum sie verwendet werden. Ein häufiges Missverständnis der Benutzer ist, dass Cookies irgendwelche Arglistigkeiten enthalten könnten und genutzt werden, um ihre Kreditkartennummern, die Sozialversicherungsnummern ihrer Kinder oder detaillierte Pläne für den Einbruch in ihre Wohnungen auszuspionieren. In der Realität sind Cookies, wenn sie korrekt genutzt werden, ein fantastisches Werkzeug zur Entwicklung sicherer und leistungsfähiger Websites.

Hier eine schöne, typische Cookie-Erklärung, die Sie verwenden können:

Diese Site verwendet Cookies nur, um Ihre Benutzerinformation zu verwalten, während Sie sich durch die Seiten bewegen. Ein Cookie ist ein kleiner Informationsabschnitt, der normalerweise genutzt wird, um einen Benutzer zu identifizieren, wenn er die Site betritt. Niemals werden persönliche Informationen in einem Cookie gespeichert und es zeichnet auch keine Informationen über einen Benutzer auf, die aus irgendwelchen Gründen anderen Sites zur Verfügung gestellt werden.

Um Ihren Browser für Cookies zu konfigurieren, gehen Sie wie folgt vor:

Internet Explorer:

Im IE 4.0 wählen Sie im Pulldown-Menü Bearbeiten den Eintrag Einstellungen. Falls Sie den IE 5.0 verwenden, greifen Sie über das Menü Extras auf die Internetoptionen zu. Unter Dateien empfangen wählen Sie Cookies. Neben Beim Empfangen von Cookies können Sie Nie nachfragen, Für jede Site nachfragen oder Für jedes Cookie nachfragen auswählen. Damit steuern Sie, ob Ihr Browser Cookies akzeptiert und ob er sie über das Eintreffen von Cookies informiert.

Netscape Navigator:

Wählen Sie im Pulldown-Menü Bearbeiten die Option Einstellungen. Wählen Sie Erweitert und markieren Sie die zutreffende Cookie-Option.

Sitzungsvariablen setzen

Falls Sie in Ihrer Applikation eine Sitzungsvariable setzen wollen, brauchen Sie eine geeignete Position dafür. Glücklicherweise wissen Sie bereits, wie dafür vorzugehen ist. Mithilfe des Verhaltens Bereich anzeigen haben Sie genau definiert, wo die Sitzungsvariable definiert werden kann. Hat sich der Benutzer korrekt angemeldet, können Sie eine Sitzungsvariable setzen, die die Benutzer-ID enthält. Diese Variable wiederum steht auf jeder Webseite innerhalb der Site zur Verfügung - ohne dass die Site Informationen zwischen den Seiten übertragen muss.

Um beispielsweise eine Sitzungsvariable mit der Benutzer-ID zu setzen, nachdem sich ein Benutzer erfolgreich angemeldet hat, öffnen Sie die Seite, die Sie mit den Bereichen für die gültige und die ungültige Anmeldung angelegt haben.

Öffnen Sie Ihren Quellcode und suchen Sie nach dem Abschnitt, der den Bereich für die gültige Anmeldung definiert:

1 <% If Not rsUser.EOF Or Not rsUser.BOF Then %>
2 <table width="100%" border="0" cellspacing="0" cellpadding="0">
3 <tr align="center" bgcolor="#00FF00">
4 <td>
5 <p><font face="Arial, Helvetica, sans-serif" size="+2">
6 Sie haben sich erfolgreich angemeldet!</font></p>
7 <p><font face="Arial, Helvetica, sans-serif" size="+2">
8 <a href="online.asp?userID=<%=(rsUser.Fields.Item("userID").Value)%>">
9 CONTINUE</a>
10 </font></p>
11 </td>
12 </tr>
13 </table>
14 <% End If ' end Not rsUser.EOF Or NOT rsUser.BOF %><br>

In der Definition des Anzeigebereichs in Zeile 1 hat UltraDev die Bedingungen festgelegt, unter denen die Sitzungsvariable gesetzt werden soll. Wenn Sie die Sitzungsvariable in diesem Bereich setzen, werden nur für gültige Benutzer Sitzungs-IDs erzeugt.

Aber wie genau geht das? Einfach - Sie fügen den folgenden Code in den entsprechenden Bereich ein:

<% Session("userID")=<Ihre Benutzer-ID-Abfrage> %>

Jetzt ersetzen Sie <Ihre Benutzer-ID-Abfrage> durch die Abfrage, die das Feld userID aus Ihrer Datenbank zurückgibt. Für mein Dokument mit der Datensatzgruppe rsUser, die das Feld userID zurückgibt, verwende ich den folgenden Befehl:

1 <% If Not rsUser.EOF Or Not rsUser.BOF Then %>
2 <% Session("userID")=rsUser.Fields.Item("userID").Value %>
3 <table width="100%" border="0" cellspacing="0" cellpadding="0">
4 <tr align="center" bgcolor="#00FF00">
5 <td>
6 <p><font face="Arial, Helvetica, sans-serif" size="+2">
7 Sie haben sich erfolgreich angemeldet!</font></p>
8 <p><font face="Arial, Helvetica, sans-serif" size="+2">
9 <a href="online.asp?userID=<%=
=>;(rsUser.Fields.Item("userID").Value)%>">
10 CONTINUE</a></font></p>
11 </td>
12 </tr>
13 </table>
14 <% End If ' end Not rsUser.EOF Or NOT rsUser.BOF %><br>

Die hier gezeigten Codebeispiele beziehen sich auf ASP-Serverplattformen. Weitere Informationen finden Sie im entsprechenden Anhang zum Setzen von Sitzungsvariablen in ColdFusion- und Java-Serverseiten.

Falls Sie keine Sitzungsvariablen verwenden, erzielen Sie eine bessere Kompatibilität mit Browsern, in denen die Cookies deaktiviert sind, aber gleichzeitig wird die Programmierung Ihrer Sites komplizierter.

Sitzungsvariablen verwenden

Nachdem eine Sitzungsvariable definiert wurde, können Sie sie überall in UltraDev verwenden - so wie eine Formularvariable oder einen URL-Parameter. Dazu brauchen Sie die Palette Datenbindungen (von der Sie noch nicht viel gesehen haben) und die folgenden einfachen Anleitungen:

  1. Öffnen Sie die Palette Datenbindungen.
  2. Klicken Sie auf das Plussymbol (+) und wählen Sie Sitzungsvariable.
  3. Geben Sie den Namen der Variablen an, die Sie in der Zuweisung auf Ihrer Webseite verwendet haben, und klicken Sie auf OK, wie in Abbildung 14.10 gezeigt.

    Abbildung 14.10:  Hier geben Sie den Namen der im Code  definierten Sitzungsvariablen ein.

Das ist alles! Die im Code definierte Sitzungsvariable steht jetzt auf jeder Seite der Site zur Verfügung. Sie verwenden die Sitzungsvariable genau wie alle anderen gebundenen Daten. Die Sitzungsvariablen und die Datensatzgruppenwerte werden in separaten Quellen aufgelistet. Abbildung 14.11 zeigt die Palette Datenbindungen mit eingetragener Sitzungsvariablen.

Abbildung 14.11:  Sitzungsvariablen erhalten einen eigenen  Eintrag in der Palette Datenbindungen.

Sitzungsvariablen in Abfragen

Sitzungsvariablen können in Abfragen verwendet werden, ähnlich wie normale Abfragevariablen (URL oder Formular). Statt jedoch die Sitzungsvariable mithilfe der Funktion Request('<variablenname>') einer UltraDev-Variablen zuzuweisen, verwenden Sie dazu die Funktion Session('<variablenname>').

Mit dieser Technik können Sie genau das tun, was Sie normalerweise auch mit URL- Parametern machen, aber statt alles an jede einzelne Seite übergeben zu müssen, wo die Parameter möglicherweise benötigt werden, stehen die Werte an jeder beliebigen Stelle zur Verfügung.

Auch hier ist die Informationsweitergabe durch Sitzungsvariablen sicherer als die Verwendung von URL-Parametern. Statt Daten hin und her senden zu müssen, werden sie auf dem Server gespeichert, und die Client-Applikation speichert nur eine Sitzungs-ID, die die Werte auf dem Server identifiziert.

In den Projekten in Woche 3 werden wir Sitzungsvariablen verwenden. Das ist sauberer und effizienter als die Übergabe von URL-Parametern. Wenn Sie statt dessen lieber Kompatibilität für alle Browser realisieren wollen, verwenden Sie URL-Parameter als Sitzungsverwaltungssystem auf Ihren Sites.

Eine kurze Bemerkung zu Sitzungen: Sitzungsvariablen werden ausschließlich vom Server verwaltet und sind gültig, solange der Benutzer den Browser verwendet. Es wird zwar ein Cookie verwendet, um eine Sitzung zwischen verschiedenen Seiten zu verwalten, aber es handelt sich nur um ein temporäres Cookie, das niemals auf der Festplatte Ihres Computers gespeichert wird.

14.6 Das Authentifizierungssystem von UltraDev

Dieses Kapitel hat Ihnen die Benutzerauthentifizierung und die Verwaltung des Benutzerstatus über verschiedene Webseiten hinweg vorgestellt. Die in UltraDev eingebauten Verhalten zur Benutzerauthentifizierung helfen, diesen Prozess zu automatisieren, aber Sie sollten verstehen, wie der zugrunde liegende Mechanismus funktioniert, um Vor- und Nachteile beurteilen zu können. Sie werden die hier beschriebenen Techniken und das Authentifizierungssystem von UltraDev noch häufig brauchen.

UltraDev führt dieselben Aktionen aus, die Sie hier kennen gelernt haben, auch das Setzen einer Sitzungsvariablen - ohne den Code auch nur einmal bearbeiten zu müssen. Eines der Probleme bei dem Verhalten ist jedoch, dass es erzwingt, den Benutzernamen als Primärschlüssel für die Benutzertabelle zu verwenden. Das ist größtenteils kein Problem, aber damit verbietet sich, dass der Benutzer (oder ein Administrator) den Benutzernamen ändern.

Während der Arbeit mit den Beispielen in der dritten Woche werden wir verschiedene Tabellen mit Benutzerinformationen genauer betrachten - von denen aus dem heute vorgestellten UserID-System bis zu einem hybriden Benutzer-ID/Benutzername-System und einem rein benutzernamenbasierten System. Sie werden die Benutzerauthentifizierung bis ins Detail kennen lernen.

Beachten Sie jedoch unbedingt, dass die Parameterübergabe zur Verwaltung des Benutzerstatus die einzige Möglichkeit ist, eine Site anzulegen, die allen Benutzern zur Verfügung steht. Diese Form der Sitzungsverwaltung wird vom Authentifizierungssystem in UltraDev nicht unterstützt.

14.7 Echte Sicherheit für Websites

Wenn Sie eine Web-basierte Anmeldung für eine Site verwenden, übertragen Sie unweigerlich einen Benutzernamen und ein Kennwort im Klartext über das Internet. Das ist nicht unbedingt ratsam, wenn Sie sichere Operationen ausführen wollen.

Um das Problem zu beheben, sollten Sie versuchen, einen sicheren, SSL-basierten (Secure Sockets Layer) Webserver zu verwenden. Wenn Sie einen sicheren Webserver einsetzen, um Ihre Anmeldeinformationen zu verarbeiten, werden alle Transaktionen zwischen dem Client und dem Server verschlüsselt, bevor sie stattfinden. Das bedeutet, eine Site mit einfachen Anmeldeschemata kann ohne zusätzlichen Programmieraufwand wesentlich sicherer werden.

Leider gibt es keine perfekte Lösung für die Websicherheit. Eine Kombination aus sinnvoller Entwicklung und intelligentem Server-Einsatz bildet die beste Verteidigung gegenüber Hackern.

14.8 Zusammenfassung

In diesem Kapitel ging es um eine der wichtigsten Funktionen auf Websites - Anmeldebildschirme. Durch Kombination von verborgenen Bereichen (Verhalten Bereich anzeigen, die nicht angezeigt werden) und Standardabfrage können Sie einen Anmeldemechanismus für Ihre Websites entwickeln. Das Verhalten Bereich anzeigen kann genutzt werden, um Informationen anzuzeigen bzw. zu verbergen, abhängig von den Ergebnissen einer Datensatzgruppen-Abfrage.

Wie verwaltet das System die Benutzerinformationen, nachdem der Benutzer sich erfolgreich angemeldet hat? Das ist nicht so einfach, wie es scheinen mag! Damit das System sich merken kann, wer sich angemeldet hat, muss es Informationen zwischen den Seiten übergeben und die entsprechenden Benutzerinformationen in der Datenbank suchen. Das Serververhalten Zu Seite mit ergänzenden Themen wechseln kann genutzt werden, um existierende Parameter zwischen Seiten zu übertragen.

Sitzungsvariablen sind eine andere Methode, Sitzungsinformationen zu verwalten, nachdem eine erfolgreiche Anmeldung stattgefunden hat. Sitzungsvariablen werden auf dem Server verwaltet und nicht bei jeder Anforderung erneut übertragen, wie es bei URL- Parametern der Fall ist. Sitzungsvariablen basieren auf einem Cookie mit der Sitzungs-ID, das auf der Client-Maschine gesetzt ist. Der Nachteil bei diesem Ansatz ist, dass der Client- Computer die Cookies aktivieren muss, damit das Programm funktioniert.

Hilfreich ist, dass die in UltraDev eingebauten Authentifizierungs-Verhalten viele der in diesem Kapitel vorgestellten Techniken automatisieren. Zur Entwicklung sicherer Sites, die sich wie vorgesehen verhalten, ist es jedoch außerordentlich wichtig, die zugrunde liegenden Techniken zu verstehen.

14.9 Fragen und Antworten

Frage:
Für welche Art von Websites sollten Anmeldungen implementiert werden?

Antwort:
Anmeldungen können für unterschiedliche Websites sinnvoll sein, unabhängig davon, ob sie sensible Daten enthalten. Beispielsweise können Sie den angezeigten Web-Inhalt den jeweils angemeldeten Benutzern anpassen. Die Information wird dadurch vielleicht nicht vollständig gesichert, aber Sie haben eine Methode, die Site für einzelne Benutzer anzupassen, was eine sehr praktische Funktionalität ist, die Sie mithilfe eines Anmeldebildschirms ganz einfach realisieren können.

Frage:
Woran erkenne ich, ob ich die Übergabe von URL-Parametern oder Sitzungsvariablen verwenden sollte?

Antwort:
Zunächst müssen Sie die Benutzer Ihrer Site bestimmen. Wenn Sie wissen, wer auf Ihre Site zugreift, können Sie problemlos Sitzungsvariablen einsetzen. Wenn Sie jedoch ein möglichst großes Publikum erreichen wollen, sollten Sie die Übergabe von URL-Parametern bevorzugen.

Frage:
Wie funktionieren Sitzungsvariablen, wenn die Information nicht in einem Cookie abgelegt wird?

Antwort:
Sitzungsvariablen werden auf dem Server gespeichert. Man spricht sie über eine Sitzungs-ID an, die in einem Cookie auf der Client-Maschine abgelegt ist. Falls der Client keine Cookies akzeptiert, können Sie keine Sitzungsvariablen setzen.

Frage:
Warum muss man Sitzungsvariablen verwalten oder URL-Parameter übergeben?

Antwort:
Das Web ist eine statuslose Umgebung. Jeder Zugriff auf eine Website ist eigenständig und einzigartig. Wenn der Webserver nicht irgendwelche Informationen vom Client-Computer erhält, kann er nicht erkennen, um wen es sich bei dem Client handelt. Cookies und die Parameterübergabe sind die beiden Methoden, die erlauben, Informationen über einen Benutzer zu verwalten, der auf Ihre Site zugreift.

14.10 Workshop

Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.

Quiz

  1. Wie nutzen Sie das Verhalten Bereich anzeigen, um Informationen zu verbergen?
  2. Was sollen Anmeldesysteme sichern?
  3. Wie schützen Sie Ihre Seiten, damit sie nicht ohne Angabe eines Benutzernamens und eines Kennworts eingesehen werden können?
  4. Wozu verwendet man das Verhalten Zu Seite mit ergänzenden Themen wechseln?
  5. Werden Datensatzgruppenvariablen mithilfe des Verhaltens Zu Seite mit ergänzenden Themen wechseln übergeben?
  6. Woran kann es liegen, wenn ein Benutzer sich nicht durch eine auf Sitzungsvariablen basierende Site bewegen kann?

Übungen

  1. Legen Sie ein eigenes Anmeldungssystem an, ähnlich dem heute vorgestellten. Ändern Sie dazu die Benutzerdatenbank nach Bedarf ab. Um es ein bisschen schwieriger zu machen, fügen Sie ein Benutzerprofil ein, sodass die Benutzer ihre Kennwörter beliebig ändern können. Das findet man häufig bei auf Anmeldungen basierenden Systemen.
  2. Experimentieren Sie ein bisschen mit der Verwendung des Verhaltens Bereich anzeigen, und verbergen oder zeigen Sie den Inhalt der Website abhängig von den Anmeldeinformationen. Sie werden schnell feststellen, dass dieses Verhalten sehr einfach in der Anwendung ist und dennoch flexibler sein kann als man denkt.
  3. Schreiben Sie das Anmeldungssystem aus Übung 1 um, sodass es den Benutzerstatus mithilfe von Cookies verwaltet. Versuchen Sie, sich an die Verwendung von Cookies auf Ihren Websites zu gewöhnen, wo immer das möglich ist - sie werden Ihre Entwicklungszeiten beschleunigen und die Wahrscheinlichkeit von Fehlern reduzieren, die entstehen, weil Statusinformationen nicht in URL-Parametern übergeben wurden.



vorheriges KapitelInhaltsverzeichnisStichwortverzeichnisFeedbackKapitelanfangnächstes Kapitel


© Markt+Technik Verlag, ein Imprint der Pearson Education Deutschland GmbH