2008-12-26 11 views
7

J'espère qu'il existe un script classe/php standard que nous pouvons utiliser pour la fonctionnalité "mot de passe oublié". Il semble que presque tous les sites en ont un, et j'aimerais réduire le temps de développement.une classe ou un script standard "mot de passe utilisateur oublié" dans un environnement php/mysql?

Il semble qu'une approche commune est:

  1. cliquez sur Mot de passe oublié
  2. utilisateur reçoit par email un lien « reset mot de passe »
  3. Cliquez sur le lien permet en tapant « nouveau mot de passe » " retapez mot de passe »
  4. vie est bonne

Je ne veux pas le faire à partir de zéro, en espérant que quelqu'un qui a pensé toutes les nuances peuvent me pointer vers le code préexistant. Il semblerait que ce soit assez standardisé. Tous: j'ai reçu des réponses, mais j'espère que quelqu'un pourra vous recommander une classe ou un CMS assez standard qui répond aux directives de sécurité généralement acceptées.

+0

salut, fais mon travail pour moi, merci –

+0

Non, c'est bon. C'est exactement le genre de chose que SO est pour. L'authentification est délicate et facile à se tromper de manière subtile qui n'apparaît que lorsque votre site a été piraté. La vérification d'un script standard dont il ne connaît peut-être pas fait partie du travail dans ce cas. –

+0

les gars, désolé pour mon premier commentaire –

Répondre

0

Vous pouvez le voler à partir d'une grande variété de frameworks/CMS. Drupal, Kohana, etc ...

+0

J'ai utilisé qcodo qui ne semble pas avoir intégré ... ce que je pensais être étrange .... – AFG

11

J'utilise mes propres scripts pour la réinitialisation du mot de passe.

Je crée une table pour stocker une user_id, une clé aléatoire et une fois que la réinitialisation de mot de passe a lancé:

// 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)"); 

Ensuite, lorsqu'un mot de passe doit être remis à zéro, le code suivant est appelé:

// $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(
    "[email protected]", // sender 
    $f['username'], // recepient 
    "From: The example.com Web Site <[email protected]>\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" 
); 
} 

Lorsque le lien dans l'e-mail est cliqué une page est affichée qui contient les éléments suivants:

// 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') 
); 

Lorsque le formulaire ci-dessus est soumis, ce qui suit est exécuté:

// 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.'); 
} 

Vous êtes invités à utiliser ce code au lieu de « rouler votre propre », mais vous aurez besoin de faire quelques changements ou ajouter quelques fonctions pour le rendre complet.

+0

Bonjour Stacey Richards, je suis votre méthode. Dites-moi, comment dois-je gérer plusieurs noms d'utilisateur en utilisant un même e-mail? Je crois que je devrais générer une "clé aléatoire" unique pour chaque "nom d'utilisateur" et ensuite les mails de livraison ... Merci – Darkeden

Questions connexes