Passwort vergessen Funktion – „Challenge-Response“-Verfahren (Teil 2)

Nun können wir mit der „Passwort vergessen“-Funktion fortfahren. Uns fehlt lediglich noch die challenge.php. Die ist aber schnell geschrieben.

Das Script challenge.php erledigt folgendes:

  • Annehmen der ChallengeID
  • Vergleichen, ob diese vorhanden ist, ob sie noch unbenutzt ist und ob sie noch gültig ist
  • Gibt ein Formular aus indem der Benutzer ein neues Passwort wählen kann
  • Speichert das neue Passwort in die Datenbank und macht die ChallengeID ungültig


Solch ein Script könnte folgendermaßen aussehen:

< ?php
 
if(isset($_GET['UserID']) &amp;&amp; isset($_GET['challenge'])) {
 $UserID		= (int)$_GET['UserID'];
 $Challenge 	= $_GET['challenge'];
 $timestamp	= time() - 24 * 3600;
}
 
if(@is_numeric((int)$UserID) &amp;&amp; @(int)strlen($Challenge) === 32) {
 
 $challenge_auslesen = mysql_query("
  SELECT
   "._PREFIX_."changepass.`change_userid`,
   "._PREFIX_."changepass.`change_challenge`,
   "._PREFIX_."changepass.`change_aktiv`,
   "._PREFIX_."changepass.`change_timestamp`,
   "._PREFIX_."user.`user_email`
  FROM
   `"._PREFIX_."changepass`
  LEFT JOIN
   `"._PREFIX_."user`
  ON
   ("._PREFIX_."changepass.`change_userid` = "._PREFIX_."user.`user_id`)
  WHERE
   ((`change_userid` = '$UserID')
  AND
   (`change_challenge` = '$Challenge')
  AND
   (`change_timestamp` &gt; '$timestamp'))
  LIMIT
   1") or logg_errors(mysql_errno(), mysql_error(), $_SERVER['PHP_SELF']);
 $change = mysql_fetch_assoc($challenge_auslesen);
 
 if(mysql_num_rows($challenge_auslesen) === 1) {
 
  if(isset($_POST['do_change'])) {
 
   $user_email= escape_string(strip_tags(trim($_POST['user_email'])));
   $user_passwort1= escape_string(strip_tags(trim($_POST['user_passwort1'])));
   $user_passwort2= escape_string(strip_tags(trim($_POST['user_passwort2'])));
 
   if(validate_email($user_email) === FALSE) {
    $error['email'] = "* Die E-Mail Adresse die Sie angegeben haber ist nicht korrekt";
   }
   if(strlen($user_passwort1) &lt; 8) {
    $error['passwort1'] = "* Zu Ihrer eigenen Sicherheit muss das Passwort mindestens 8 Zeichen lang sein";
   } elseif(preg_match("/^[a-z]+$/", $user_passwort1)) {
    $error['passwort1'] = "* Zu Ihrer eigenen Sicherheit sollte das Passwort nicht nur aus Kleinbuchstaben bestehen";
   } elseif(preg_match("/^[A-Z]+$/", $user_passwort1)) {
    $error['passwort1'] = "* Zu Ihrer eigenen Sicherheit Sollte das Passwort nicht nur aus Großbuchstaben bestehen";
   } elseif(preg_match("/^[0-9]+$/", $user_passwort1)) {
    $error['passwort1'] = "* Zu Ihrer eigenen Sicherheit sollte das Passwort nicht nur aus Zahlen bestehen";
   }
   if($user_passwort1 != $user_passwort2) {
    $error['passwort2'] = "* Die beiden Passwörter sind nicht identisch";
   }
 
   if(!empty($error)) {
    echo '
<div class="wrong">';
    if(!empty($error['email'])) { echo $error['email'].'
'; }
    if(!empty($error['passwort1'])) { echo $error['passwort1'].'
';}
    if(!empty($error['passwort2'])) { echo $error['passwort2'].'
';}
    echo '';
 
    echo '
<form method="post">
<dl>
<dt><label for="user_email">E-Mail:</label></dt>
<dd><input id="user_email" name="user_email" type="text" value="{$UserEmail}" /></dd>
</dl>
<dl>
<dt><label for="user_passwort1">Passwort:</label></dt>
<dd><input id="user_passwort1" name="user_passwort1" type="password" /></dd>
</dl>
<dl>
<dt><label for="user_passwort2">Passwort wiederholen:</label></dt>
<dd><input id="user_passwort2" name="user_passwort2" type="password" /></dd>
</dl>
<dl>
<dt>Optionen:</dt>
<dd>
       <input id="do_change" class="button" name="do_change" type="submit" value="Jetzt ändern!" />
       <input id="reset" class="button" name="reset" type="reset" value="Doch nicht..." />
   	 </dd>
</dl>
</form>
 
';
 
  } else {
 
   $user_passwort = pass_protection($user_passwort1);
 
   $user_aktuallisieren = mysql_query("
    UPDATE
     `"._PREFIX_."user`
    SET
     `user_email` = '$user_email',
     `user_passwort` = '$user_passwort'
    WHERE
     `user_id` = '$UserID'") or die(mysql_error());
 
    $challenge_deaktivieren = mysql_query("
     UPDATE
      `changepass`
     SET
      `valid` = 0
     WHERE
      `user_id` = '$UserID'") or die(mysql_error());
 
   if($user_aktuallisieren === TRUE) {
    echo 'Ihr Passwort wurde erfolgreich geändert. Bitte loggen Sie sich erneut ein.';
   } else {
   	echo 'Beim Ändern ist ein Fehler aufgetreten. Bitte versuchen Sie es später nochmal.';
   }
 
  }
 
  } else {
   echo '
<form method="post">
<dl>
<dt><label for="user_email">E-Mail:</label></dt>
<dd><input id="user_email" name="user_email" type="text" value="{$UserEmail}" /></dd>
</dl>
<dl>
<dt><label for="user_passwort1">Passwort:</label></dt>
<dd><input id="user_passwort1" name="user_passwort1" type="password" /></dd>
</dl>
<dl>
<dt><label for="user_passwort2">Passwort wiederholen:</label></dt>
<dd><input id="user_passwort2" name="user_passwort2" type="password" /></dd>
</dl>
<dl>
<dt>Optionen:</dt>
<dd>
      <input id="do_change" class="button" name="do_change" type="submit" value="Jetzt ändern!" />
      <input id="reset" class="button" name="reset" type="reset" value="Doch nicht..." />
	 </dd>
</dl>
</form>
 
';
  }
 } else {
  // CHALLENGE NICHT VORHANDEN
 }
}
?>

Auch hier sollten Sie beachten, dass dieses Script nur als Beispiel dienen soll und somit nicht alles ausführlich behandelt!

Somit sind wir auch schon am Ende unserer Funktion angelangt. Wie Sie sehen ist eine sichere „Passwort vergessen“-Funktion gar nicht so kompliziert. Es erfordert lediglich ein bisschen Zeit.

Ergänzungen und Kritik sind bei mir immer willkommen, denn nur dadurch lassen sich die Artikel optimal optimieren. Also schreck nicht zurück und schreib mir was Du zum Artikel denkst und was Du besser finden würdest. Also ran an das Kommentarformular. ;)

ALL-INKL.COM

Sei Du der Erste! Es existieren noch keine Kommentare.