Passwort per email aktivieren

JamesT

Erfahrenes Mitglied
Hallo Community,

ich habe ein "Passwort vergessen" skript, was ich gern um ein Sicherheitsfeature erweitern würde. Im Moment muss der User nur seine Email Adresse eintragen, und schon wird ein neues Passwort generiert, in die DB geschrieben und per Email verschickt.

Ich denke es wäre besser wenn ich per email einen link verschicke, der erst nach dem anklicken das neue in der email mitgesendete passwort generiert und in die DB schreibt.

Oder sendet man danach nochmal eine email mit dem passwort? Ich denke es hat sich sicher schonmal jemand den Kopf zerbrochen, wie man das am besten machen sollte. :-)

Ich würde mich freuen wenn mir jemand ein paar Denkanstöße geben kann, und mir vielleicht auch bei der Realisierung unter die Arme greift falls ich nicht weiterkomme.

Hier mein aktuell verwendetes Skript:

PHP:
    <?php
    session_start();  // Start Session
    session_register("session");
    // This is displayed if all the fields are not filled in
    $empty_fields_message = "<p>Please go back and complete all the fields in the form.</p>Click <a class=\"two\" href=\"javascript:history.go(-1)\">here</a> to go back";
    // Convert to simple variables  
    $email_address = $_POST['email_address'];
    if (!isset($_POST['email_address'])) {
	if($lang=="en") echo "<h2>Recover a forgotten password!</h2>";
	else echo "<h2>Erstellen eines neuen Passworts!</h2>"; ?>

    <form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
        <p class="style3"><label for="email_address">Email:</label>
        <input type="text" title="Please enter your email address" name="email_address" size="30"/></p>
        <p class="style3"><label title="Reset Password">&nbsp</label>
        <input type="submit" value="Submit" class="submit-button"/></p>
    </form>
    <?php
    }
    elseif (empty($email_address)) {
        echo $empty_fields_message;
    }
    else {
    $email_address=mysql_real_escape_string($email_address);
    $status = "OK";
    $msg="";
    //error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR);
    if (!stristr($email_address,"@") OR !stristr($email_address,".")) {
    $msg="Your email address is not correct<BR>"; 
    $status= "NOTOK";}

    echo "<br><br>";
    if($status=="OK"){  $query="SELECT email_address,username FROM users WHERE users.email_address = '$email_address'";
    $st=mysql_query($query);
    $recs=mysql_num_rows($st);
    $row=mysql_fetch_object($st);
    $em=$row->email_address;// email is stored to a variable
     if ($recs == 0) {  echo "<center><font face='Verdana' size='2' color=red><b>No Password</b><br> Sorry Your address is not there in our database . You can signup and login to use our site. <BR><BR><a href='http://www.jackgodfrey.org.uk/register'>Register</a> </center>"; exit;}
    function makeRandomPassword() { 
              $salt = "abchefghjkmnpqrstuvwxyz0123456789"; 
              srand((double)microtime()*1000000);  
              $i = 0; 
              while ($i <= 7) { 
                    $num = rand() % 33; 
                    $tmp = substr($salt, $num, 1); 
                    $pass = $pass . $tmp; 
                    $i++; 
              } 
              return $pass; 
        } 
        $random_password = makeRandomPassword(); 
        $db_password = md5($random_password); 
         
        $sql = mysql_query("UPDATE users SET password='$db_password'  
                    WHERE email_address='$email_address'"); 
         
        $subject = "Your password at www.yoursite.com"; 
        $message = "Hi, we have reset your password. 
         
        New Password: $random_password 
         
        http://www.yoursite.com/login
        Once logged in you can change your password 
         
        Thanks! 
        Jamest
         
        This is an automated response, please do not reply!"; 
         
        mail($email_address, $subject, $message, "From: yoursite.com Webmaster<admin@jyoursite.com>\n 
            X-Mailer: PHP/" . phpversion()); 
        echo "Your password has been sent! Please check your email!<br />"; 
        echo "<br><br>Click <a href='http://www.yoursite.com/login'>here</a> to login";
     } 
     else {echo "<center><font face='Verdana' size='2' color=red >$msg <br><br><input type='button' value='Retry' onClick='history.go(-1)'></center></font>";}
    }
    ?>

Danke und Gruß

Jamest
 
du könntest ein zweites Feld (würde auch ohne gehen, aber diese Methode bevorzuge ich persönlich) erstellen, das du "new_pass" nennst in dem du sofort bei der Anfrage ein neues Passwort generierst, dieses hat noch keine Funktion, aber wenn der User dann auf die Seite ?.php geleitet wird, durch deine Email, welche einen hash oder sonstiges zur Identifikation anchfolgen sollte (kannst ja noch ein Feld "mail_id" erstellen, welche die Mail identifizieren kann, hierzu würde sich beispielsweise die md5-summe aus user und email anbieten, oder sonstigem, kannst ja deiner Fantasie freien lauf lassen), wenn dann die Seite ?.php die Identifikation prüft, so nimmt er nur das Feld, welches auch diese ID benutzt und macht ein update vom Feld "pass" (oder wie immer es bei dir heißen mag), mit dem Wert von "new_pass"...

also im Sinne von:
Code:
$sql = "UPDATE
    Deine Tabelle
SET
    pass = '".$row['new_pass']."';";

Natürlich fehlt hier und da noch etwas code, aber das wäre so der Ansatz den ich verfolgen würde, es gibt noch viele Andere, denn im Grunde ließe sich das Ganze auch nur mit den Feldern realisieren, die du bereits hast, aber dann kannst du halt nicht in die Email bereits das Passwort mit rein schreiben, oder wenn du das Mail_ID Feld weglässt, dann kann es sein, das diese leichter geraten werden und, und, und...

mfg
ophasis
 
Hi,

also ich hab das so gelöst:

1. User geht auf die Seite wo er ein neues Passwort beantragen kann.
2. Er gibt seine E-Mail an
3. Script überprüft ob die E-Mail existiert und schreibt in der Datenbank wo der User drin steht in das Feld "pass_string" einen verschlüsselten einmaligen string.. ich hab hier md5(time()) -> besser wäre noch ein salt hinzuzufügen.
3. es wird eine Mail verschickt mit dem Parameter ?foo=6345353453533453 <- entspricht dem md5 hash
4. User geht auf die Seite
5. es wird in der Datenbank nach dem md5 Hash gesucht und wenn gefunden wird er User auf eine Seite weitergeleitet wo er dann ein neues Passwort eintragen kann


Gruß
 
Kennwörter sollten wenn überhaupt nur in verschlüsselten E-Mails verschickt werden. Aber selbst das ist in den meisten Fällen nicht notwendig.

Mach es am besten wie folgt: Frage bei der Registrierung eine geheime Sicherheitsfrage samt richtiger Antwort ab, aber eine, die nicht trivial ist. Wenn der Benutzer nun sein Kennwort vergessen hat und es ändern möchte, wird ihm eine E-Mail mit einem Link mit einem zufällig generierten Sicherheitsschlüssel zugeschickt, der gleichzeitig serverseitig gespeichert wird. Dieser Sicherheitsschlüssel sollte zudem nur für eine begrenzte Zeit (beispielsweise 30 Minuten) gültig sein. Folgt der Benutzer dem Link und ist der Sicherheitsschlüssel gültig, kann er nach Beantwortung der Sicherheitsfrage ein neues Kennwort bestimmen. Danach wird der Sicherheitsschlüssel entwertet.
 
Vielen Dank schonmal für die Ansätze von euch. Ich werde mal versuchen irgendwas in der Richtung zu realisieren.

@Gumbo,

deine Lösung ist auch sehr nett, das Problem wäre bei mir nur, das wir schon ca 1000 user in der Datenbank habe, welche dann noch keine Sicherheitsfrage/Antwort definiert hätten.

Also denke ich wird dieses zusatzlösung schonmal flach fallen, oder?

Grüße

Jamest
 
ich würd 3 Spalten für das pw nehmen.
Wenn einer das pw vergessen hat wird in die 1. Spalte das neue geschrieben.....in der 2. steht ein aktivation code ?.php?code=1792347af634d23fe75
wenn der == $row['code'] is dann wird das pw1 auf spalte pw2 übertragen.......



(nicht gut aber war so nen einfall von mir)
 
Zurück