"kullanıcı şifremi unuttum"

2 Cevap php

Sanırım "şifremi unuttum" işlevsellik için kullanabileceğiniz bir standart sınıf / php script olduğunu umuyorum. Neredeyse her web sitesi bir tane var gibi görünüyor, ve ben onu geliştirme süresini azaltmak istiyorum.

Bu ortak bir yaklaşım olduğunu görünür:

1) click on Forgot password 2) User receives via email a "reset password" link 3) Click on the link allows typing in "new passowrd" "retype password" 4) life is good

Ben herhangi bir nüanslar düşünülmüş kişidir kodunu önceden mevcut beni işaret edebilir umuduyla, sıfırdan bunu yapmak istemiyorum. Bu oldukça standart olduğu görünüyor.

Tümü: Bazı tepkiler var, ama ben belki birisi genel kabul görmüş güvenlik kurallarına uyduğunu oldukça standart bir sınıf veya CMS tavsiye edebilir umuyorum .... teşekkürler

Teşekkürler.

2 Cevap

Ben parola sıfırlama için kendi komut dosyalarını kullanabilirsiniz.

Ben bir user_id, rasgele bir anahtar ve parola sıfırlama başlatılan bir süre depolamak için bir tablo oluşturun:

// query is my own SQLite3 wrapper function which ensures I have a valid database connection then executes the SQL.
// I would imagine small changes will be needed to the SQL for MY SQL.
query("create table reset_password (user_id integer not null default 0, key text not null default '', time integer not null default 0)");
query("create unique index reset_password_user_id on reset_password (user_id)");
query("create index reset_password_key on reset_password (key)");

Bir parola sıfırlama gerekir Sonra, aşağıdaki kod denir:

// $user_id must be an integer that matches a valid user's ID.
function reset_password($user_id) {
  query("delete from reset_password where user_id = $user_id");
  $key = substr(base64_encode(crypt('', '')), 0, 32);
  query("insert into reset_password values ($user_id, '$key', " . time() . ")");
  // fetch is my own wrapper function to fetch a row from the query.
  $f = fetch(query("select username from users where id = $user_id"));
  // smtp is my own function, you will probably want to use the php mail function.
  smtp(
    "do-not-reply@example.com", // sender
    $f['username'], // recepient
    "From: The example.com Web Site <do-not-reply@example.com>\r\n" . // email headers
    "To: {$f['username']} <{$f['username']}>\r\n" . // actual email address <put a nice friendly name in here if you have the the information>
    'Subject: Reset Password' . "\r\n" .
    "\r\n" .
    "Hello\r\n" . // email body
    "\r\n" .
    "A request has been made to reset your example.com web site password.\r\n" .
    "\r\n" .
    "To complete the request, click on the following link within 48 hours of the transmision of this email and follow the on screen instructions.\r\n" .
    "\r\n" .
    /// URL is defined as the root of the URL used in the email, in this example it would be "http://example.com/"
    URL . "index.php?page=reset-password&user_id=" . urlencode($user_id) . "&key=" . urlencode($key) . "\r\n" .
    "\r\n" .
    "Kind regards,\r\n" .
    "\r\n" .
    "The example.com Web Site"
  );
}

E-postadaki bağlantıya tıklandığında bir sayfa aşağıdaki içeren görüntülenir:

// form, input_hidden, table, tr, td, label, input_password and input_submit are my own wrappers which return the appropriate HTML with escaped values where required.
echo
  form('reset-password/ok',
    input_hidden('user_id', $_GET['user_id']) .
    input_hidden('key', $_GET['key']) .
    table(
      tr(
        td(label('New Password')) .
        td(input_password('new_password', ''))
      ) .
      tr(
        td(label('Confirm Password')) .
        td(input_password('confirm_password', ''))
      )
    ) .
    input_submit('ok', 'OK')
  );

Yukarıdaki form gönderildiğinde, aşağıdaki yürütülür:

// The reset_password_message function displays the message to the user.
if (!isset($_POST['user_id'])) {
  reset_password_message('You must enter a user ID. Please try again.');
} else if (!isset($_POST['key'])) {
  reset_password_message('You must enter a key. Please try again.');
} else if (!isset($_POST['new_password']) || !$_POST['new_password']) {
  reset_password_message('You must enter a new password. Please try again');
} else if (!isset($_POST['confirm_password']) || $_POST['new_password'] != $_POST['confirm_password']) {
  reset_password_message('The new password and the confirmation do not match. Please try again.');
} else if (!$f = fetch(query("select time from reset_password where user_id = " . (integer)$_POST['user_id'] . " and key = '" . escape($_POST['key']) . "'"))) {
  reset_password_message('The user ID and key pair are invalid. Please try again.');
} else if ($f['time'] < time() - 60 * 60 * 24 * 2) { // 60 seconds * 60 minutes * 24 hours * 2 days (48 hours as explained in the email sent to the user above).
  reset_password_message('The user ID and key pair have expired. Please try again.');
} else {
  query("update users set password = '" . crypt($_POST['new_password']) . "' where id = " . (integer)$_POST['user_id']);
  reset_password_message('Your password has been reset. Please login.');
}

Bunun yerine "kendi çalışırken" bu kodu kullanmak için buyrun, ancak birkaç değişiklik yapmak ya da eksiksiz yapmak için bir kaç fonksiyon eklemek gerekir.

Sen çerçeveler / CMSS çeşitli onu çalabilir. Siteye, Kohana, vs ..