Webserver schützen
Sicherer anmelden

BetriebssystemBig DataData & StorageOpen SourcePolitikRechtSicherheitSoftwareWorkspace

Soll eine Website nicht allen Benutzern offen stehen, muss eine Anmeldung mit Usernamen und Passwort geschaffen werden. Lesen Sie, wie man per PHP einen eigenen Login schafft, der das vom Benutzer eingegebene Kennwort nicht im Klartext über das Netz schickt.

Authentication

Webserver schützen

Eine Zugangskontrolle per Name und Kennwort für ein Internet-Angebot ist schnell eingerichtet. Dazu muss man bei der Verwendung von Apache als Webserver nur einen Eintrag in der Kontrolldatei ».htaccess« anlegen, der die so genannte Basic Authentication aktiviert, und dem System die erlaubten Benutzerkennungen mitteilen. Im Browser erscheint dann der typische Login-Screen, wo der Surfer seine Anmeldedaten eingeben muss, bevor der Zugang freigeschaltet wird. Diese Authentifizierung lässt aber keinen Freiraum für Individualität. Sobald weitere Felder gefordert sind oder die Logik erweitert werden soll, müssen Sie ein eigenes Formular bauen. Über den entsprechenden Inputfeld-Typ »password« lässt sich dabei dann zwar die Benutzereingabe am Bildschirm verschleiern, aber beim Absenden des Formulars wird das Kennwort ungeschützt über die Datenleitung geschickt. Dagegen hilft der Algorithmus MD5.

Mehr als nur Quersummen
Die Methode MD5 bietet eine gute Möglichkeit, Checksummen von beliebigen Eingabedaten anzulegen. Man kann MD5 aber auch dazu verwenden, einen sicheren Login zu bauen. Der prüft zwar das Passwort, übermittelt es aber nicht im Klartext, was es jedem offenbaren würde, der die Internet-Verbindung abhört.


MD5-Wert

Webserver schützen

Das zentrale Konzept dabei ist, nicht das Passwort selbst zu übertragen, sondern lediglich den MD5 davon. Nur bietet diese Methode noch kaum Sicherheit, denn ein Lauscher an der Leitung, der den MD5-Wert mitliest, könnte sich mit einem eigenen System zu einem späteren Zeitpunkt einfach anmelden. Er hätte nicht das Klartext-Passwort, aber mit dem MD5- Wert davon einen nicht minder wertvollen Schatz ? nichts wäre so gewonnen. Sicher wird es, wenn der Login als Eingangsdaten für den MD5 nicht nur das Passwort allein verwendet, sondern dazu noch weitere Daten anfügt, die sich bei jedem Login ändern. Das könnte ein zufälliger String oder ein Zeitstempel sein. Im vorgestellten Beispielskript findet die Session-ID Verwendung ? ein von PHP automatisch vergebener Wert, wenn man mit Sessions arbeitet. Dieser String aus Hex-Ziffern hat den Vorteil, dass ihn PHP innerhalb einer Sitzung selbstständig behält. Würden Sie dagegen einen anderen Wert verwenden, müssten Sie ihn zwischen den beiden separaten Aufrufen der Darstellung des Login-Formulars und seiner Auswertung auf dem Server zwischenspeichern. Die Session-ID dagegen wird entweder als Cookie abgelegt oder in der URL gespeichert.


Das Funktionsprinzip

Webserver schützen

Die Session-ID wird vom Browser auf der Seite des Anwenders mit dem eingegebenen Passwort verkettet und der MD5-Wert an den Server gesendet. Der errechnet dann den MD5 aus dem bei ihm gespeicherten Kennwort und des Zufallsstring sund verifiziert das Ergebnis mit dem übermittelten Wert. Auf der Seite des Servers ist MD5 schon in den Bordmitteln enthalten, da PHP die Funktion md5() unterstützt. Nur muss der Browser auch eine Möglichkeit haben, das Kennwort, das der User in einem Formular eingegeben hat, mit MD5 zu bearbeiten. Javascript beherrscht zwar von Haus aus kein MD5, lässt sich aber über eine frei erhältliche Javascript-Bibliothek von Paul Andrew Johnston (http://pajhome.org.uk) problemlos nachrüsten. Die benötigte Quellcode-Datei »md5.js« wird im HTMLDokument einfach per Skriptbefehl geladen.


Verschleiernd

Webserver schützen

Das Prinzip funktioniert so: Das PHP-Skript »login.php« hat beim ersten Aufruf fast nichts zu tun. Es beschränkt sich darauf, das Formular inklusive des eingebetteten Javascript-Programms darzustellen. Das Login-Formular enthält die beiden Felder für den Usernamen und das Kennwort. Sendet der Anwender das Login-Formular per Klick auf den Button ab, wird durch den im Form-Tag enthaltenen Zusatz onsubmit=”submit_handler()” die Javascript-Funktion submit_handler aufgerufen, bevor die Formulardaten an den Server abgeschickt werden. Diese Funktion tauscht den Inhalt des Feldes »f_pw«, das das Klartext- Passwort enthält, automatisch gegen seine kodierte Entsprechung aus. Hier findet auch der einzige dynamische Einsatz des PHP-Skript statt, das die Session-ID in direkt ins Javascript- Programm einbaut:

strSrc = document.loginform.f_pw.value;
strSrc = strSrc+’‘;
document.loginform.f_pw.value = hex_md5(strSrc);

Beim Beenden liefert submit_handler() ein true zurück und bewirkt dadurch, dass die Übertragung der Formulardaten durchgeführt wird. Der Empfänger ist dabei das Skript selbst.


Wiedererkennbar

Webserver schützen

Beim diesem Aufruf stellt das Skript nun fest, dass Formulardaten vorhanden sind, und wertet diese aus. Dazu wird zuerst die Funktion getPassword() aufgerufen. Die soll zum Usernamen das dazugehörige Passwort ausgeben. Der Inhalt von getPassword() wird bei jedem konkreten Einsatz des Skriptes ein wenig anders aussehen, je nach Datenbankserver und Aufbau der Tabelle mit den Benutzerdaten. Darum hat die Funktion im Listing nur beispielhaften Charakter und liefert immer »geheim« als Kennwort zurück. Sie müssen sie also für eine ernsthafte Anwendung erst noch mit Leben füllen. Mit dem ermittelten Kennwort führt das PHP-Skript nun dieselbe Operation durch wie das Javascript zuvor mit dem ins Formular eingegebenen Kennwort: Die aktuelle Session- ID wird angehängt und der MD5 dieser Zeichenkette ermittelt. Sind die beiden MD5-Werte, also der per Formular gelieferte und der in PHP berechnete Wert, identisch, hat der Benutzer das richtige Passwort eingegeben. Das PHP-Skript verzweigt in diesem Fall einfach zur imaginären Startseite »start.php«. In einer richtigen Anwendung würde man zuvor wahrscheinlich noch eine Session-Variable setzen, um etwa den Usernamen festzuhalten. Denn ansonsten wäre beim Aufruf der Folgeseite die Information »ist ein erfolgreich angemeldeter User« ja wieder verloren.


MD5 in der Nahaufnahme

Webserver schützen

Die Ausgabe des Algorithmus Message Digest 5 oder kurz MD5 wird auch »Fingerabdruck« genannt. Der Algorithmus berechnet eine lediglich 16 Byte große Hex-Zahl aus beliebigen Eingabedaten, aber das Ergebnis ist charakteristisch für den Inhalt der Ausgangsdaten. Das bedeutet insbesondere, dass ein einziges verändertes Bit in den Ausgangsdaten den MD5-Code total verändert. So lautet der MD5 der Zeichenkette »Hase« beispielsweise EE1C6181C49456AFA7BC053E95A9C0E4. Verwendet man dagegen »hase« kleingeschrieben, erscheint als Output 50B401B8605EE77ADA5E87135F57156A. Für den Einsatz als Verschlüsselungsmittel bietet diese Empfindsamkeit von MD5 gegenüber Änderungen an den Eingabedaten einen entscheidenden Vorteil: Ein Hacker tut sich schwer, sich durch Ausprobieren verschiedener an ein Ergebnis heranzutasten, weil er nicht feststellen kann, ob er total daneben liegt oder das Ziel nur haarscharf verfehlt hat. Der MD5-Algorithmus wird oft dazu verwendet, heruntergeladene Daten zu verifizieren. Dazu liefert der Anbieter etwa eines CD-Images für ein Linux-System neben den Daten selbst ihren MD5-Code, um zu überprüfen, ob alle Bytes korrekt angekommen sind. Mit dem Linux-Tool »md5sum« lässt sich nach dem Download die Checksumme der empfangenen Daten verifizieren.


Listing

Webserver schützen

";
}
else
{
// Nun Hash über Klartext-PW in Datenbank
// + Session-ID berechnen
$sOwnMd5=md5($sPwDB . session_id());
if ($sOwnMd5<>$sGivenMd5)
echo 'Die Zugangsdaten waren
falsch !';
else
{
// alles in Ordnung, User darf
rein
header("Location: start.php");
exit;
}
}
}
?>

Login


name="loginform" onsubmit="submit_handler()">
User
Passwort