Sicheres Loginsystem?

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
 
Spricht eigentlich irgendwas dagegen den Inhalt der Cookies per Formular weiterzugeben?

Hier zum Beispiel edit.php um eingegebene Daten zu editieren:
PHP:
while ($sqlx = mysql_fetch_array($sqlz)) {
echo "<form action='edit.php' method='POST'>\n";
echo "<input type='hidden' name='sessionid' value='".$_POST['sessionid']."'>\n";
echo "<input type='hidden' name='benutzer' value='".$_POST['benutzer']."'>\n";
echo "<input type='hidden' name='edit_eintrag' value='".$sqlx['daten_id']."'>\n";
echo "<input type='submit' name='sub' value='Eintrag bearbeiten'></form>\n";
}

Die Variablen sessionid und benutzer werden zu Beginn jeder Seite auf ihre Gültigkeit mit DB validiert.
So könnte man vollständig auf Cookies verzichten.
 
Wenn Du immer alles per Formular uebergeben willst kannst Du aber keine richtigen Links mehr haben. Daher ist das meiner Meinung nach recht unpraktisch.
Und man kann ja durchaus ohne Cookies arbeiten, Sessions funktionieren auch ohne Cookies, und die zuvor auch erwaehnte HTTP-Authentication nutzt auch keine Cookies.
Cookies sind bei Sessions optional um die SessionID zu uebergeben. Diese kann aber durchaus auch im URL uebergeben werden. Ansonsten sind Cookies eigentlich nur noetig wenn man ein automatisches Login haben will wie man es auf vielen Seiten findet sodass man sich eben nicht bei jedem Besuch neu einloggen muss.
 
Zurück