Browsersitzung mit Name und Passwort
Der hier vorliegende Artikel beschreibt die Verwendung eines Session-Cookie der bei jedem Folgerequest einen einmal angegebenen Benutzernamen und Passwort zurück an die Authority sendet. Dabei wird der Session-Cookie nur solange im Browser gehalten wie dieser geöffnet ist.
Damit der Benutzer seine Zugangsdaten (Credentials) eingeben kann, muss zunächst ein Formular vorliegen. Die Request-Method sollte unbedingt als POST realisiert werden, damit die Credentials nicht im URL sichtbar werden und die Übertragung sollte über einen Secure Socket Layer (SSL) erfolgen. Damit ist sicherheitstechnisch alles abgesichert. Nach dem Absenden werden Benutzername und Passwort serverseitig validiert. Sofern sich der Benutzer erfolgreich ausgewiesen hat, sendet der serverseitige Prozess einen Cookie, also einen zusätzlichen Response-Header mit ebendiesem Benutzernamen und Passwort als SHA2-Hash zurück zum Browser
Betrachte untenstehenden Code:
use strict;
use warnings;
use Digest::SHA qw(sha256_hex);
use base 'Factory';
my $m = main->new;
my $dbh = $m->dbh;
my $user = "Benutzername"; # Aus dem Anmeldeformular
my $pass = "Passwort"; # Aus dem Anmeldeformular
print
$dbh->selectrow_array("select sha2(concat(?,?), 256)", {}, $user,$pass),
"\n",
sha256_hex($user.$pass);
# Ausgabe
#edee3b9c51bdae0daa483767136ac7e2b1e827d31b26ca0b0bec6bbe9805f205
#edee3b9c51bdae0daa483767136ac7e2b1e827d31b26ca0b0bec6bbe9805f205
Es gibt also sowohl mit Perl (sha256_hex) als auch mit Funktionen des RDMS (MySQL, sha2) die Möglichkeit der Erzeugung einer eindeutigen Kennung aus Benutzername+Benutzerpasswort. Dieser Hash mit einer Länge von 64 Bytes ist als eindeutiger Schlüssel in der Benutzertabelle hinterlegt, über diesen Schlüssel wird der Benutzer authentifiziert und dieser Schlüssel dient gleichermaßen als Session-ID:
$self->header( "Set-Cookie" => "sid=$sid; secure" );
Da dieser Cookie kein Ablaufdatum enthält, verfällt er mit dem Schließen des Browsers, ist also nur über eine Session gültig. Bei jedem Folgerequest an die gleiche Authority (Domäne) sendet der Browser Benutzername und Passwort, also diesen SHA2-Hash mit dem Cookie, das heißt daß der Benutzer seine Zugangsdaten nicht jedesmal neu eingeben muss wenn er die Seite wechselt. Der Benutzer kann also, hat er sich einmal angemeldet, weitere Daten an die Authority senden oder Seiten abrufen die nur nach einer erfolgreichen Anmeldung zugänglich sind. Tipp: Setze den Security-Parameter (Flag) in den Cookie, siehe oben. Dieses Flag weist den Browser an, den Cookie nur über eine gesicherte Verbindung (https) zu senden.
Die Namen der Benutzer müssen eindeutig sein, ebenso die aus Benutzername+Passwort erzeugten SHA2-Schlüssel, was mit einem dem entsprechenden Tabellendesign realisiert wird. Damit gibt es die Möglichkeit zur Wiederherstellung bzw. zum Rücksetzen von Passwörtern. Das Passwort selbst wird auf diese Art und Weise nicht in der Benutzertabelle gespeichert sondern nur der SHA2-Hash, der bei einer Passwortänderung natürlich auch neu erzeugt werden muss.
Es gibt zwei Fälle zur Parameterkontrolle. Einmal wäre zu prüfen ob die gesendeten Credentials richtig sind, also wenn zur Anmeldung die Formulardaten gesendet werden. Zum Anderen ist stets zu prüfen, ob der Client den Cookie sendet mit dem Benuztzname+Passwort entsprechenden SHA2-Hash als den Session-Key.
Für den Cookie gibt es den Parameter expires. Damit kann man festlegen, wann der Cookie abgelaufen ist, bspw. nach 10 Minuten:
$self->header(
"Set-Cookie" => "sid=$sid; expires=".$self->http_date(time + 600)
);
sid=edee3b9c51bdae0daa483767136ac7e2b1e827d31b26ca0b0bec6bbe9805f205; expires=Mon, 11 Nov 2024 15:59:17 GMT
Mit dem Senden des Headers Clear-Site-Data wird der Browser angewiesen, alle Cookies zu löschen:
$self->header(
"Clear-Site-Data" => qq("cookies")
);
womit der Benutzer abgemeldet wird.
Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. sos@rolfrost.de. Entity: 351d2f17e83f327fb0fd24a51148e445