2012-01-14 2 views
2

Интересно, может ли кто-нибудь мне помочь.Password Reset Link Expiry

Я провел довольно много исследований по процессу «Сброс пароля» и из одного из найденных мной учебников, я смог скомпоновать следующий код, который обеспечивает эту функциональность.

Забыл пароль

<?php 

// Connect to MySQL 
$c = mysql_connect("host", "user", "password"); 
mysql_select_db("database", $c); 

// Was the form submitted? 
if ($_POST["ForgotPasswordForm"]) 
{ 
    // Harvest submitted e-mail address 
    $emailaddress = mysql_real_escape_string($_POST["emailaddress"]); 

    // Check to see if a user exists with this e-mail 
    $userExists = mysql_fetch_assoc(mysql_query("SELECT `emailaddress` FROM `userdetails` WHERE `emailaddress` = '$emailaddress'")); 
    if ($userExists["emailaddress"]) 
    { 
       // Create a unique salt. This will never leave PHP unencrypted. 
       $salt = "KEY"; 

     // Create the unique user password reset key 
$password = md5($salt . $userExists["emailaddress"]); 


     // Create a url which we will direct them to reset their password 
     $pwrurl = "phpfile.php?q=" . $password; 

     // Mail them their key 
     $mailbody = "Dear user,\n\nIf this e-mail does not apply to you please ignore it. It appears that you have requested a password reset at our website \n\nTo reset your password, please click the link below. If you cannot click it, please paste it into your web browser's address bar.\n\n" . $pwrurl . "\n\nThanks,\nThe Administration"; 
     mail($userExists["emailaddress"], "", $mailbody); 
     echo "Your password recovery key has been sent to your e-mail address."; 
    } 
    else 
     echo "No user with that e-mail address exists."; 
} 

?> 

Сброса пароль

<?php 

// Connect to MySQL 
$c = mysql_connect("host", "user", "password"); 
mysql_select_db("database", $c); 

// Was the form submitted? 
if ($_POST["ResetPasswordForm"]) 
{ 
    // Gather the post data 
    $emailaddress = mysql_real_escape_string($_POST["emailaddress"]); 
    $password = md5(mysql_real_escape_string($_POST["password"])); 
    $confirmpassword = md5(mysql_real_escape_string($_POST["confirmpassword"])); 

    $q = $_POST["q"]; 

    $passwordhint = $_POST["passwordhint"]; 

    // Use the same salt from the forgot_password.php file 
    $salt = "KEY"; 

    // Generate the reset key 
    $resetkey = md5($salt . $emailaddress); 

    // Does the new reset key match the old one? 
    if ($resetkey == $q) 
    { 
     if ($password == $confirmpassword) 
     { 
      // Update the user's password 
      mysql_query("UPDATE `userdetails` SET `password` = '$password', `passwordhint` = '$passwordhint' WHERE `emailaddress` = '$emailaddress'"); 
      echo "Your password has been successfully reset."; 
     } 
     else 
      echo "Your password's do not match."; 
    } 
    else 
     echo "Your password reset key is invalid."; 
} 

?> 

Теперь я хотел бы добавить синхронизированное истечение ссылки, которую я посылаю к пользователю. Я смотрел сообщение в сообществе Stackoverflow и многих других, но я не смог найти то, что искал.

Я просто задавался вопросом, может ли кто-нибудь помочь мне, пожалуйста, и дайте мне небольшое руководство о том, как я могу это сделать.

Большое спасибо.

+0

У вас действительно есть данные подключения к базе данных в * все * ваши файлы PHP? – ThiefMaster

+0

Привет, нет, я просто использую это, пока я совмещаю свои скрипты. Затем они меняются для работы с одним файлом. С наилучшими пожеланиями – IRHM

ответ

1

Добавить поле в таблицу пользователей с меткой времени при запросе сброса пароля. Когда вы проверяете, соответствует ли ключ, отметьте метку времени, чтобы узнать, сколько ей лет.

Это вы имеете в виду?

+0

Привет, да, это то, чего я пытаюсь достичь. С уважением – IRHM

0

Способ, которым я выполняю это, заключается в том, чтобы сохранить как хэш, который вы отправляете пользователю, так и временную метку, когда она была сгенерирована в таблице пользователей.

Когда они посещают страницу сброса, проверьте хэш, который они дают против одного в базе данных, а не генерируют его снова (делая это таким образом, вы можете использовать по-настоящему случайные хэши, так как вам не нужно помнить, как оно было создано в первое место), а также отметьте метку времени.