PHP Passwort vergessen funktion

  • Hallo,

    Ich hab ein passwort vergessen Script das nicht ganz so funktioniert wie ich das möchte und zwar das Script schaut ob die E-Mail vorhanden ist, es löscht auch das alte Passwort trägt aber kein neues ein an was kann das liegen?

    Hier das Script:

    Hoffe ihr könnt mir helfen.

    Mfg


  • Wird wohl daran liegen, dass chr(trim($pass)) in deinem UPDATE-Befehl einen leeren String zurückgibt. Andernfalls würde das Passwort ja nicht "gelöscht" werden. (gelöscht wird es ja nicht, sondern auf einen leeren Wert gesetzt)
    Gib dir mal beim UPDATE dein $sql aus.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • An der Stelle wo du das Passwort updaten möchtest schreibst du

    PHP
    $sql = "UPDATE
                            ft_user
                        SET
                            pass = '".chr(trim($pass))."'
                        WHERE
                            email = '".mysql_real_escape_string(trim($_POST['email']))."'
                       ";


    Da sollst du einfach mal ein

    PHP
    echo $sql;


    hintersetzen. Dann kannst du sehen wie der Query aussieht und was für die Variablen eingesetzt wird. Ich möchte wetten, dass in dem Query dann steht "... SET pass='' WHERE ..."
    Wo hast du denn eigentlich die Passwortgenerierung her? chr() sagte mir jetzt spontan nichts, noch nie verwendet, aber ich vermute mal, dass das Problem damit zusammenhängt. Ansonsten sieht das nämlich alles soweit erstmal richtig aus.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Da Script sah am Anfang anderst aus und so funktioniert es auch einwandfrei.

    Das stand dort:

    PHP
    // Neues Passwort erstellen
                $pass = substr(md5(microtime()),0,8);
                $sql = "UPDATE
                            ft_user
                        SET
                            pass = '".md5(trim($pass))."'
                        WHERE
                            email = '".mysql_real_escape_string(trim($_POST['email']))."'
                       ";
                mysql_query($sql) OR die("<pre>\n".$sql."</pre>\n".mysql_error());

    Allerdings wird bei meinem Login das Passwort nicht md5 Verschlüsselt und so hab ich rumgeggogelt und ausbrobiert wie ich das ändere, nur ich hab nichts gescheites gefunden.


  • Wenn du das Passwort nur für die Datenbank anders verschlüsseln möchtest brauchst du das auch nur im Datenbank-Query ändern. Die Passwort-Generierung lässt du wie sie ist. Bist du sicher, dass chr() die richtige Funktion für dich ist?

    http://php.net/manual/de/function.chr.php
    chr
    (PHP 4, PHP 5)
    chr — Gibt ein einzelnes Zeichen zurück

    Also das lässt du so wie es ist:

    PHP
    $pass = substr(md5(microtime()),0,8);

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Okay.

    Mir wurde gesagt dass wenn ein Passwort md5 verschlüsselt ist kann man es nicht mehr entschlüsseln sprich das Script selber verschlüsselt ja das Passwort wie soll man das dann in der Datenbank anders abspeichern?


  • Um genau zu sein verschlüsselt md5() nicht. md5() ist ein Hashverfahren, und die sind nicht rückrechenbar.
    D.h. ein String ergibt wenn er mit md5() gehasht wird immer den gleichen 32-Zeichen-String (Hash) der nicht zurückgerechnet werden kann. Da aber eben immer der gleiche Hash generiert wird können die Passwörter aber trotzdem abgeglichen werden. Beim Login hasht man einfach das vom User eingegebene Passwort und vergleicht diesen Hash-Wert dann mit dem der in der Datenbank hinterlegt ist.
    Das erste md5() bei der Generierung des Passwortes $pass in deinem Script hat aber noch nichts mit der Form zu tun, in der es dann in der Datenbank abgelegt wird (ob jetzt gehasht oder verschlüsselt). Es geht ja da erstmal um das Passwort im Klartext, md5() ist an der Stelle nur ein Hilfsmittel zur Erstellung eines zufälligen Passwortes.
    microtime() gibt den aktuellen Unix-Timestamp mit Mikrosekunden zurück. Dieser Timestamp wird dann mittels md5() gehasht um einen 32-Zeichen-String aus Zahlen und Buchstaben zu erhalten. Da 32 willkürliche Zeichen aber arg lang sind für ein Klartextpasswort wird dieser String noch mittels substr() auf 8 Zeichen gekürzt.
    Was dann in $pass gespeichert wird ist also ein 8-Zeichen-String aus Zahlen und Buchstaben. Das ist das neue Passwort des Users im Klartext, wie es auch an ihn verschickt wird.

    Wie dieses Passwort dann für die Datenbank verschlüsselt oder gehasht wird braucht nur bei der Übergabe des Passworts an die Datenbank festgelegt werden.
    Wenn du deine Passwörter verschlüsseln willst (um die Möglichkeit zum entschlüsseln zu haben) solltest du dir mal AES oder RSA anschauen. Dann brauchst du allerdings auch keine Funktion die dir ein neues Passwort generiert, weil du dann ja die Möglichkeit hast den Usern in der "Passwort vergessen"-Funktion ihr aktuelles Passwort entschlüsselt mitzuteilen.

    Wenn du die Passwörter hashen möchtest kannst du dir sha1 oder md5 anschauen. Da solltest du allerdings zusätzlich einen Salt verwenden (ein String der vor dem hashen an die Passwörter gehängt wird), da es besonders für md5 mittlerweile sehr umfangreiche Rainbow-Tables gibt (Tabellen die Strings und ihre zugehörigen md5-Hashs abbilden).

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Gerne. Zur Verschlüsselung mit AES oder RSA hat Dodo hier im Forum auch schon einen Thread eröffnet:
    https://www.forum-hilfe.de/threads/48792-…her-abspeichern

    Das Problem an der Verschlüsselung ist, dass du immer auch zumindest den Key zum Entschlüsseln im Klartext parat haben, also auch auf dem Server verfügbar. D.h. sollte jemand wie auch immer kompletten Zugriff auf den Server bekommen, hat er potentiell sofort auch alle Passwörter im Klartext. Bei Passwort-Hashs mit randomized salts dauert das schon länger.

    Edit: Bezüglich des Mail-Versands möchte ich dir mal noch wärmstens den PHPMailer ans Herz legen. Von der PHP-Funktion mail() rate ich dir ab.
    Kurzes Tut zum PHPMailer:
    http://phpforum.de/forum/showthread.php?t=216932

    Zum verschlüsseln muss ich grad noch bezüglich RSA korrigieren. Dort gibt es unterschiedliche Keys zum ver- und entschlüsseln. Der Server benötigt also zum Passwort-Abgleich nur den Key zum verschlüsseln.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    Einmal editiert, zuletzt von SinnlosS (9. März 2011 um 23:25) aus folgendem Grund: PHPMailer-Hinweis ergänzt