Lebensdauer von Passwörtern begrenzen

  • Hallo,

    ich will die Lebensdauer von Passwörtern in meiner DB begrenzen. Ich habe mir dazu schon mal ein paar Gedanken gemacht und mal etwas das Web durchforstet.

    Dort findet man halt viel dazu, wie man Passwörter erstellt, aber nichts zu Begrenzung der Lebensdauer.

    Ich hab auch auf php.net mal gezielt nach Funktionen gesucht, die Begriffe wie time, expire, password usw. enthalten. Da kam aber nichts sinnvolles raus.

    Meine Idee:

    Der Countdown für die Lebensdauer (x) des Passwortes startet mit dem ersten Login des Users. Deshlab müsste man diesen Zeitpunkt in der Datenbank ablegen.
    Dann müsste es ein Skript geben, dass in bestimmten Zeitabständen prüft, welche Passwörter ungültig sind und diese aus der DB löscht.
    Dabei stellen sich mir 2 Probleme:
    Wie schreibe ich ein Skript, das automatisch startet?
    Und wie müsste man den Zeitabstand wählen, damit jedes Passwort auch genau nach x Tagen ungültig wird und nicht 5 Minuten fürher oder 3 Stunden später?

    Vielleicht könnt ihr mir ja mal paar Tipps geben.
    Links würden genügen.
    Danke!

  • warum checkst du nicht einfach beim einloggen des users ob das erstellen des alten passwortes schon $x monate aus ist und wenn ja, dann zwingst du ihn, ein neues zu erstellen?

    Dann müsste es ein Skript geben, dass in bestimmten Zeitabständen prüft, welche Passwörter ungültig sind und diese aus der DB löscht.


    und wie soll sich der user authentifizieren, nachdem du ihm das pw gelöscht hast?

  • Wie schreibe ich ein Skript, das automatisch startet?



    Soetwas wird üblicherweise von einem Serverdienst verwaltet und hat nichts mit deinem eigentlichen Programm zutun. Du schreibst dein Programm quasi ohne Achten auf den Ausführungszeitpunkt und sagst deinem Server zum Beispiel, dass er dieses Programm jeden Tag um 13 Uhr ausführen soll (Siehe: Cronjob).

    In deinem Problemfall ist das aber gar nicht notwendig. Du kannst diese Überprüfung bei jeder Anfrage stellen:

    PHP
    UPDATE users SET password = '' WHERE DATE_ADD(lastlogin,INTERVAL 1 DAY) < NOW();



    Diese SQL-Abfrage setzt die Spalte password überall auf einen leeren String, wo das Datumsfeld lastlogin mindestens einen Tag alt ist.

    Dann kann man sich aber mit jenen Accounts nicht mehr einloggen. ;)
    Eine bessere Idee wäre, das Problem auszulagern: Und zwar solltest du die Passwörter nicht gleich löschen, sondern die restliche Funktionalität deiner Programme einfach für die blockieren, welche alte Passwörter benutzen.

    PHP
    SELECT * FROM users WHERE id = $id AND DATE_ADD(lastlogin,INTERVAL 1 DAY) < NOW();



    Insofern die Spalte id deine Benutzertabelle eindeutig durchnummeriert, kannst du mit dieser Abfrage feststellen, ob der aktuelle Benutzer - identifiziert durch $id - ein altes Passwort benutzt. Falls ja, liefert die Anfrage eine Zeile zurück. Falls nicht, keine.

  • Hallo,
    ich hab das jetzt so realisiert

    Wenn das Passwort abgelaufen ist, dann ist $val also immer leer.

    Nun mal noch eine andere Frage dazu:
    Wenn der User sich ausloggt, möchte ich ihm gerne mitteilen, wie lange sein Passwort noch gültig ist.
    Ich hab da mal folgendes zusammengebastelt:

    PHP
    $exp = "DATE_ADD(firstlogin, INTERVAL 48 HOUR)";
    
    
    $result = mysql_query("SELECT DATEDIFF($exp, NOW())  FROM sac_users WHERE user=$user");


    Hier wird zuerst das Datum ausgerechnet, an dem das Passwort verfällt, davon wird dann das aktuelle Datum abgezogen.
    Scheint mri aber eher ein gewagtes Konstrukt zu sein. Das ganze funktioniert momentan schon deshalb nicht, weil nicht weiß, wie ich den eigentlichen Wert des Query bekomme.

  • Scheint mri aber eher ein gewagtes Konstrukt zu sein. Das ganze funktioniert momentan schon deshalb nicht, weil nicht weiß, wie ich den eigentlichen Wert des Query bekomme.

    Hab die SQL-Query jetzt nicht angeschaut. Den Wert wuerdest du jedenfalls so bekommen:

    PHP
    // Entweder so:
    $res = mysql_query("SELECT DATEDIFF(...)");
    $row = mysql_fetch_array($res);
    $wert = $row[0];
    
    
    // Oder so:
    $res = mysql_query("SELECT DATEDIFF(...) AS wert");
    $row = mysql_fetch_assoc($res);
    $wert = $row['wert'];

  • Wie schreibe ich ein Skript, das automatisch startet?

    Soetwas wird üblicherweise von einem Serverdienst verwaltet und hat nichts mit deinem eigentlichen Programm zutun. Du schreibst dein Programm quasi ohne Achten auf den Ausführungszeitpunkt und sagst deinem Server zum Beispiel, dass er dieses Programm jeden Tag um 13 Uhr ausführen soll (Siehe: Cronjob).

    Ich hatte mal das Problem, dass ich auf dem Server keine Cronjobs verwenden durfte. Trotzdem brauchte ich eine Routine, die zu bestimmten Zeiten ausgeführt wird und diverse Berechnungen und Queries durchführte.
    Ich hab daher ein Script geschrieben, das bei jedem Seitenaufruf lief. Es hat nachgesehen, ob es schon wieder Zeit für einen Durchlauf ist. Es hat ein paar Kniffe gebraucht, um zu verhindern, dass es mehrmals gleichzeitig lief.
    Es wurde also erst dann berechnet, wenn die Werte das erste mal nötig waren. Also wenn der erste User diese abgefragt hat.

    Später kam dann, dass einige Resultate per Mail verschickt werden sollten.
    Daher mussten diese Berechnungen zu den richtigen Zeitpunkten erfolgen, unabhängig ob ein User Online war oder nicht.
    Es stellte sich noch immer das Problem, dass auf dem Server seitens des Hosters keine Cronjobs erlaubt waren.
    Wir haben es dann so gelöst, dass das Berechnungsscript von mehreren anderen (zwecks Ausfallsicherheit) stellen aufgerufen wurde. Wir haben einfach den Aufruf mittels Passwort und IP Adresse gefiltert, dass niemand "unbefugter" die Berechnung starten konnte. Die Lösung um gleichzeitiges Ausführen zu verhindern hatten wir ja bereits drin.

    Es muss also nicht immer ein Cronjob auf dem eigentlichen Server sein. Man muss nur das Script zu bestimmten Zeiten oder NACH einer bestimmten Zeit anstoßen. Das kann mitunter auch von Außen ausgelöst werden. Man sollte dann nur bedenken, dass diese Aufrufe genügend gegen Manipulation und Ausfälle abgesichert sind.

    Nur so als Denkanstoß ;)
    LG

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!