Passwort vergessen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Passwort vergessen

    Hi Forum,

    doofe frage aber wollte mich die Tage mal mit ner guten "passwort-vergessen-funktion" auseinandersetzen. Mit email versand, die nen link enthält, der bei klick das passwort resettet und nur 30 min gültig ist etc.

    Hat da vielleicht jemand ein gutes Tutorial zur Hand?

    habe schon google durchgeforstet aber nichts wirklich brauchbares gefunden. Sind mir alle nicht tiefschürfend genug ^^

    grüße
    Timo
    ----[Blockierte Grafik: http://www.smilie-harvester.de/smilies/Alltag/putzen.gif] Nein ich bin nicht die Signatur, ich Putz hier nur ---
  • Nen Link habe ich nicht.

    Tutorials sind auch ganz nett, aber ich verstehe nicht, warum immer jeder ein Tutorial will ;)

    Ich weiss nicht, wieviel Erfahrung du hast.
    Aber am besten lernt man wenn man das Konzept selber ausarbeitet anstatt es zu "übernehmen".

    Man nehme sich einen Zettel und einen Stift und fängt bei (1) an :)

    Ich gehe mal davon aus, dass du schon eine Tabelle in deiner DB mit "user" und "passwd" besitzt.

    (1) User klickt auf die Passwd vergessen Funktion.
    Welche Daten sollen zur Identifizierung und Spamvermeidung genutzt werden?
    Man kann die eMail nehmen oder den user oder geb.Datum oder mehrere Eingaben verbinden oder oder oder

    (2) User gibt die required Daten ein
    Was soll hier passieren?
    Es muss natürlich eine eMail verschickt werden.
    In dieser eMail muss ein eindeutiger Link enthalten sein.
    Dem Link muss in der Datenbank ein Datum zugeordnet werden.

    (3) Nach dem Klick auf den Link gelangt der User zu einer Landingpage.
    Was soll dort passieren?
    Das Datum des Links muss natürlich geprüft werden.
    Soll der Benutzer selber ein Passwd angeben dürfen? Oder klickt er auf einen Button, womit ihm eine erneute eMail mit einem zufälligem PW zugeschickt wird?

    (4) ... usw. ...
  • Hi vince, zettel und stift sind schon lange gezückt, blatt vollgeschrieben und struktogramm gezeichnet. Was in welchen schritten passieren soll, darüber bin ich mir bewusst.

    Nur so sachen wie:
    1. Den link verschicken. Der user gibt seine email addy ein und ajax überprüft erstmal ist die mail vorhanden... Falls ja, sende daten an Formular. Formular erstellt nun nen confirme_code, md5 hash aus time() oder so ähnlich.
    nicht vorhersagbar halt. Diesen verschicke ich via link per mail http:mein-seite.de/pwrequest?concode=653c75ef5564aef etc pp... der confirme code wird in die Db geschrieben. Klickt der User auf den link wird
    gechecked ob der code auch in der db vorhanden ist. Wenn ja change pw und sende es via mail, delete confirme code.

    Sowei war ich schon. Allerdings sollte der confirme code nach einer bestimmten Zeit aus der Datenbank gelöscht werden, wenn der user in innerhalb der zeit nicht benutzt hat er pech gehabt. Meine Frage nun, wie
    realisiere ich am besten diese automatische löschung? cronjob? geht nur max alle 4 stunden, der Zeitraum ist meiner meinung nach zu lange.
    Zusätzlich nen timestamp in der db speichern, script bei seitenaufrufe starten, das einträge löscht die älter als 30 min sind? auch nicht sicher, dass immer user auf der seite sind die dann das script unbewusst anschubsen.
    Warum gibts in Mysql nicht ne möglichkeit, eine gültigkeitsdauer für eingefügte daten festzulegen. z.b table kunden spalte confirme_code hat ne gültigkeit von 30 min, ist er älter haut mysql ihn raus... *träum*
    Ja das ist so ziemlich mein hauptproblem, wie bekomme ich den confirme-code elegant nach 30 min aus der Db gekickt ...?!

    2. Ist der Confirme_code in der Datenbank vorhanden, wird ein neues pw generiert, das wird dann per mail geschickt und im anschluss als md5 hash in der Db gespeichert. Aber das pw blanko via mail zu senden ist auch nicht
    die sicherste variante oder?

    fragen über fragen.. Darum wollte ich nen gutes ausführliches tutorial, in der hoffnung das es meine fragen beantwortet... naja dann müsst ihr halt herhalten :P
    ----[Blockierte Grafik: http://www.smilie-harvester.de/smilies/Alltag/putzen.gif] Nein ich bin nicht die Signatur, ich Putz hier nur ---
  • eseL schrieb:

    Hi vince, zettel und stift sind schon lange gezückt, blatt vollgeschrieben und struktogramm gezeichnet. Was in welchen schritten passieren soll, darüber bin ich mir bewusst.

    Nur so sachen wie:
    1. Den link verschicken. Der user gibt seine email addy ein und ajax überprüft erstmal ist die mail vorhanden... Falls ja, sende daten an Formular. Formular erstellt nun nen confirme_code, md5 hash aus time() oder so ähnlich.
    nicht vorhersagbar halt. Diesen verschicke ich via link per mail http:mein-seite.de/pwrequest?concode=653c75ef5564aef etc pp... der confirme code wird in die Db geschrieben. Klickt der User auf den link wird
    gechecked ob der code auch in der db vorhanden ist. Wenn ja change pw und sende es via mail, delete confirme code.

    Sowei war ich schon. Allerdings sollte der confirme code nach einer bestimmten Zeit aus der Datenbank gelöscht werden, wenn der user in innerhalb der zeit nicht benutzt hat er pech gehabt. Meine Frage nun, wie
    realisiere ich am besten diese automatische löschung? cronjob? geht nur max alle 4 stunden, der Zeitraum ist meiner meinung nach zu lange.
    Zusätzlich nen timestamp in der db speichern, script bei seitenaufrufe starten, das einträge löscht die älter als 30 min sind? auch nicht sicher, dass immer user auf der seite sind die dann das script unbewusst anschubsen.
    Warum gibts in Mysql nicht ne möglichkeit, eine gültigkeitsdauer für eingefügte daten festzulegen. z.b table kunden spalte confirme_code hat ne gültigkeit von 30 min, ist er älter haut mysql ihn raus... *träum*
    Ja das ist so ziemlich mein hauptproblem, wie bekomme ich den confirme-code elegant nach 30 min aus der Db gekickt ...?!

    2. Ist der Confirme_code in der Datenbank vorhanden, wird ein neues pw generiert, das wird dann per mail geschickt und im anschluss als md5 hash in der Db gespeichert. Aber das pw blanko via mail zu senden ist auch nicht
    die sicherste variante oder?

    fragen über fragen.. Darum wollte ich nen gutes ausführliches tutorial, in der hoffnung das es meine fragen beantwortet... naja dann müsst ihr halt herhalten :P


    Meiner Meinung nach solltest du den timestamp speichern und dann einfach nen cron laufen lassen. Wobei der Cronjob reicht, wenn der einmal in der Woche läuft. Ansonsten könntest du noch mit Triggern arbeiten. Andererseits, warum willst du die Daten unbedingt löschen? Eventuell kannst du später noch Rückschlüsse daraus ziehen.

    Dann zu deiner Frage mit dem Versand des Passworts. Wenn du das Passwort nicht verschicken willst, kannst du dem Usr ja die Möglichkeit geben ein neues Passwort zu setzen. Ich find generierte Passwörter meistens nervig und ändere die meistens gleich. So spart man sich einen Schritt. Sicherlich ist E-Mail-Versand nicht das sicherste. Aber wen sollte das Passwort von einer Applikation X interessieren? Wie sollte er es abhören? Und würde sich der Aufwand das abzuhören überhaupt lohnen?
  • Dann bist du ja schon so gut wie fertig :P

    Du musst die Einträge nicht unbedingt aus der DB löschen.

    Wenn du zu jedem hash ein timestamp generierst, kannst du beim aufruf der seite "foo.php?bar=hash" den hash in der Datenbank suchen "SELECT timestamp FROM XYZ where hash='hash' ".

    Den Timestamp kannst du dann mittels php prüfen wenn der hash existiert.

    Kommt drauf an wie du ihn setzt. Wenn du den Timestamp zum Erstellungsdatum setzt, dann prüfst du ob TIMESTAMP (aus der Datenbank) + 30 Minuten (108000 Sekunden) > time() (Aslo jetzt) .
    Wenn das der Fall ist, dann ist seine Zeit abgelaufen ;)

    Ansonsten versendest du eine eMail.
    Das mit dem Mail versenden ist ja auch wieder so ne Sache. Du speicherst deine PW´s im Klartext, was du dir abgewöhnen solltest.
    Nimm lieber ein hash Verfahren md5 oder sha1 (sind auch nicht soo die sichersten, aber besser als nix).
    Dann kannst du automatisch ein neues Zufalls PW generieren, womit sich der User einloggen kann. (Du kannst ihm ja die Möglichkeit geben, dass PW nach dem Login geben.)


    Warum die EInträge löschen?
    Sagen wir in der Tabelle ist nen hash VARCHAR(32 oder 64) und nen username VARCHAR(50?).
    Heisst quasi, dass bis die Tabelle 1mb erreicht, benötigst du ca. 12000 Einträge ;)
  • ok klar wenn ich zum generierten hash nen timestamp speicher kann ich den ja prüfen ob der älter als 30 min is, falls ja mach nix, falls nein generatepw();.. irgendwie hätt ich da selber drauf kommen können :rolleyes:

    und nee ich speicher meine passörter natürlich als md5 hash :), ich meinte das passwort wird generiert und im klartext per mail versendet, im anschluss wird es natürlich ein md5hash daraus erzeugt und erst dann in der db gespeichert...

    und das mit den einträgen löschen, kam mir nur in den sinn, weil ich zuerst ohne timestamp arbeiten wollte und dann hätte ich nur geprüft, ob der hash in der db gespeicher ist und falls nein, hätte es kein neues passwort generiert, darum wollt ich ihn nach 30 min rauslöschen, damit es danach nciht mehr möglich ist das pw zu ändern bzw zurückzusetzen. aber das mit dem timestamp auslesen und ausrechnen wie alt der is is ne gute idee so werd ichs wohl machen!

    grüße
    Timo
    ----[Blockierte Grafik: http://www.smilie-harvester.de/smilies/Alltag/putzen.gif] Nein ich bin nicht die Signatur, ich Putz hier nur ---
  • BennyBunny schrieb:

    Nimm lieber ein hash Verfahren md5 oder sha1 (sind auch nicht soo die sichersten, aber besser als nix).


    Bei MD5 hast du recht. Bei Sha1 naja - Aber mir is bisher noch keine Rainbowtable untergekommen, welche nen doppelten sha zurückrechnen kann. Also sha1(sha1())

    mehrere Hash´s zu kombinieren ist auch ne Alternative :)
    Noch besser ist md5(sha1(

    @eseL
    Noch sicherer ist es, wenn der User sein Passwort selber eingibt und es nicht per mail verschickt wird ;)
  • achja nur der richtigkeit halber

    Kommt drauf an wie du ihn setzt. Wenn du den Timestamp zum Erstellungsdatum setzt, dann prüfst du ob TIMESTAMP (aus der Datenbank) + 30 Minuten (108000 Sekunden) > time() (Aslo jetzt) .
    Wenn das der Fall ist, dann ist seine Zeit abgelaufen

    30 * 60 = 108000 ?! :P

    grüße
    Timo
    ----[Blockierte Grafik: http://www.smilie-harvester.de/smilies/Alltag/putzen.gif] Nein ich bin nicht die Signatur, ich Putz hier nur ---
  • eseL schrieb:

    achja nur der richtigkeit halber

    Kommt drauf an wie du ihn setzt. Wenn du den Timestamp zum Erstellungsdatum setzt, dann prüfst du ob TIMESTAMP (aus der Datenbank) + 30 Minuten (108000 Sekunden) > time() (Aslo jetzt) .
    Wenn das der Fall ist, dann ist seine Zeit abgelaufen

    30 * 60 = 108000 ?! :P

    grüße
    Timo


    natürlich nicht, das wären 30 Tage :D

    1800 ist die richtige Antwort für 30 Minuten