Hallo!
Ich hatte da eine Idee wir ich evtl. mit PHP und HTTP-Auth eine möglichst sichere und einfache Login-Session erstellen kann. Ich hatte dazu zwar unten schonmal was geschrieben([pref:t=32932&m=180132]), nur fand ich es wichtig genug es einmal in den Mittelpunkt zu rücken, außerdem war der Beispiel-Code schlecht.
Und zwar stelle ich mir das so vor, das der User sich über HTTP-AUTH einloggen muß, was in PHP mit dem 401-Header gemacht wird, dann prüfe ich in PHP die AUTH-Daten in den Variablen PHP_AUTH_USER und PHP_AUTH_PW wenn die korrekt sind dann erstelle ich entweder eine Session mit dem usernamen als Wert für die session_ID, oder wenn eine Session mit dieser ID(also für diesen User) bereits läuft, dann starte ich eben diese.
Ein Beispiel-Script mit dem das ganze (zumindest oberflächlich und zumindest bei mir)hervorragend funktioniert:
<?php
$userarray = array('haus' => 'haus9',
'andreas' => 'test',
'baum' => 'baum9');
if (!isset($_SERVER['PHP_AUTH_USER']) ||
$userarray[$_SERVER['PHP_AUTH_USER']] != $_SERVER['PHP_AUTH_PW'] ||
!in_array($_SERVER['PHP_AUTH_USER'],array_keys($userarray))) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
session_id($_SERVER['PHP_AUTH_USER']);
session_start();
if (!isset($_SESSION['zaehler'])) {
$_SESSION['zaehler'] = 0;
} else {
$_SESSION['zaehler']++;
}
}
?>
Das ganze bietet IMHO einige Vorteile gegenüber allen anderen Lösungen die ich kenne:
- Die "SessionID" wird über die HTTP-AUTH HEader übertragen, welche IMHO schwerer zu manipulieren sind als Cookies und URLs,
- man erreicht nichst ohne das Passwort, d.h. man kann ohne das Passwort keine Session übernehmen
- die HTTP-AUTH Daten sind am wenigsten anfällig für Störungen(vor/zurück im Browser...)
- Ich kann über die Session einen Login-Timeout festlegen
- Der Angreifer weiß nicht dass es überhaupt eine Session gibt(!!!)
- Die "sessionID" wird _nirgendwo_ aus Versehen geloggt, das Passwort schon gar nicht
- Das ganze ist sehr performant da ich nicht bei jedem Zugriff auf eine Datenbank zugreifen muß, zumindest nicht extra um eine Session_ID herauszufinden.
- IMHO kommt das einem "echten" Login wie bei SSH oder FTP schon sehr nahe
- Session läßt sich auf einem anderen PC übernehmen
Ich habe das jetzt mal so wie ich es oben gepostet habe ein wenig ausprobiert, und das ganze klappt prima! Ich wüßte nicht wo es da Probleme geben könnte. Was sagt Ihr dazu? Ist das evtl. doch unsicher, oder würdet Ihr das aus einem anderen Grund nicht so machen?
Viele Grüße
Andreas
PS: Ich würde noch den Session_save_path in ein eigenes Verzeichnis legen.