Tom: LogIn mit Daten aus MySQL DB sicher?

Beitrag lesen

Hello,

$sql = mysql_query("SELECT Passwort, Login FROM zugang WHERE Login = '$Login'") OR die(mysql_error());

ich würde das anders abfragen:

$sql = "update $logintable ".
         "set login = now(), ".
         "    lastclick = now() ".          "    session = '".session_id()."', ".
         "    logged = 1 ".
         "where password = '".mysql_real_escape_sting($password, $con)."' ".
         "and loginname = '".mysql_real_escape_sting($loginname, $con)."' ".
         "and locked = 0;

$ok = mysql_query($sql, $con);

if($ok and mysql_affected_rows($con) == 1)
  {
    ## login ok, weitermachen
    #
    # ...
  }
  else
  {
    ## Fehlerbehandlung
    $_errormsg[] = 'Fehler beim Login';
    $_errormsg[] = mysql_error($con);
    # ...
  }

Ich setze voraus, dass auf loginname ein Unique-Index liegt, um die Verwaltung zu vereinfachen.

Nach obiger Methode hast Du gleich die Loginzeit und den letzten Request eingesetzt, geprüft, ob der Account gesperrt ist, und eine Gegenprüfung für die aktive Session vorbereitet.

Eine "is_logged()"-Funktion kann man dann ähnlich aufbauen, ebenfalls mit Update.

$sql = "update $logintable ".
         "set lastclick = now() ".          "where session = '".session_id()."' ".
         "and time_to_sec(timediff(now(), lastclick)) < $maxpause) ".
         "and locked = 0;

Wenn man Trigger und storred Procedures nutzt, kann man das noch viel eleganter machen.

Die Abfrage des Grundes, warum ein Login oder eine Loginbestätigung nicht geklappt haben, macht man erst dann mit einem ensprechenden SELECT, wenn es in Frage kommt. Wir gehen doch erstmal davon aus, dass die User "ordentlich" sind und daher seltener Fehler auftreten, als "anständige" Bestätigungen.

lastclick       Spalte mit dem letzten Request des Users
logged          Spalte mit einem Wert z.B. 0 für nicht logged, 1 für logged
session         Spalte mit der aktuellen Sessionnummer des Users
locked          Spalte mit einem Merker für gesperrte User, 0 = frei, >0 = Sperrgrund

$maxpause       Dein Konfigurationswert in Sekunden, wie lange eine logische Session
                gültig sein soll. Er muss KLEINER sein, als der Wert für die physische
                Session, also der Wert des Garbage Collectors von PHP

Außerdem ist das die() hier wieder vollkommen unangebracht.

Ein harzliches Glückauf

Tom vom Berg
http://bergpost.annerschbarrich.de

--
Nur selber lernen macht schlau