Hm, das mit HTTP-Authentifizierung finde ich ziemlich genial.
Allerdings ist das manuelle Updaten der .htaccess ein Unding.
session.use_only_cookies sind Off. Anscheinend hab ich irgendwo ein Fehler...
Aber mal angenommen es würde klappen, bleibt noch die Frage, wie ich den Client prüfe, wenn sich die IP ändert, wie das bei manchen Providern ist. Bzw. wenn die IP gleich bleibt, wie in Uni, Internet-Cafe etx. [Flex] hatte da ja die Idee mit HTTP_USER_AGENT. Aber auch das kann man ja in seinem Browser unterdrücken. Bekomme ich u.U. also kein "persönlichen" Hash von dem Client.
Und selbst hier im Forum geht nicht ohne Cookies
Der einzige Nachteil bei Cookies ist, dass einige Benutzer Cookies verweigern.
Ansonsten würde ich sagen ist das System sicherer als $_SESSIONS.
Hab nochmal 'mein' Login-System verbessert:
1. Benutzernamen und LoginID werden gehast und bei jeder Seite überprüft ob beide Werte zusammengehören. Ich möchte den sehen, der die Kombination knackt.
2. Wenn 10 Minuten lang der Benutzer nichts macht, wird die Session ungültig. Selbst wenn ein Unbefugter irgendwie an die Cookies kommt, ist die Wahrscheinlichkeit höher, dass 10 Minuten rum sind und die Session eh tot ist.
Beim Registrieren wird nur Passwort mit Buchstaben-Zahlen-Kombi ab 8 Zeichen Länge erlaubt.
Das Login-Formular verweist auf cookie_check.php:
PHP:
if ($_POST['anm'] == "Anmelden") {
$nick = mysql_real_escape_string($_POST['nick']);
$pssw = md5(mysql_real_escape_string($_POST['pssws']));
// Datenbankabfrage
$sqlps = "SELECT benutzer, psswd, email FROM $tbname WHERE benutzer='$nick' AND psswd='$pssw'";
$sqlpsa = mysql_query($sqlps);
$sqlpsb = mysql_num_rows($sqlpsa);
if ($sqlpsb == 1) {
// Cookies setzen
$sqlpsc = mysql_fetch_array($sqlpsa);
$cemail = $sqlpsc["email"];
$cemailb = md5($cemail.$nick."iu78Zwqay");
setcookie('Benutzer', $cemailb);
$date = DATE(y.s.d.m);
$md5sess = md5($nick.$pssw.$date."9Hv5zqq0");
$jetzt = time();
mysql_query("UPDATE $tbname SET idsess='$md5sess', uxtime='$jetzt' WHERE benutzer='$nick'");
setcookie('SessionID', $md5sess);
header ("Location: $url/index.php");
} else {
setcookie('Benutzer', '');
setcookie('SessionID', '');
header ("Location: $url/index.php?f=1");
}
} else {
header ("Location: $url/index.php?f=2");
}
Zu Beginn jeder Seite wird valsession() aufgerufen:
PHP:
$cuser = htmlentities($_COOKIE['Benutzer']);
$csess = htmlentities($_COOKIE['SessionID']);
function valsession() {
global $cuser, $csess, $varsess, $tbname;
if (($cuser == "") OR ($csess == "")) {
$varsess = "3";
} else {
$varsessa = "SELECT md5user, idsess, uxtime FROM $tbname WHERE md5user = '$cuser' AND idsess = '$csess'";
$varsessb = mysql_query($varsessa);
$varsessc = mysql_num_rows($varsessb);
$zeita = mysql_fetch_array($varsessb);
$zeitb = $zeita['uxtime'];
$jetzt = time();
if (($varsessc == 1) AND ($jetzt - $zeitb <= 600)) {
mysql_query("UPDATE $tbname SET uxtime='$jetzt' WHERE md5user='$cuser'");
$varsess = "1";
} else {
$varsess = "2";
setcookie('Benutzer', '');
setcookie('SessionID', '');
}
}
}
Das einzige was ich mich frage, ob die Datenbankanfrage auf _jeder_ Seite eigtl gut in die Ressourcen geht? Hab bei jeder Seite ein SELECT und ein UPDATE nur für die Benutzervalidierung. Ich kann das nicht einschätzen...Ist das zuviel für den Server?
Bin dankbar fuer Kritik.
Chers