|
首先,我們假定你已經(jīng)有了一個用戶注冊系統(tǒng)。其中用戶表可能如下: create table member( id int unsigned not null auto_incremtnt, username……………… passwords char(32) not null, email varchar(100) not null, …………………………….. ); 現(xiàn)在討論的焦點不是數(shù)據(jù)庫設(shè)計,我們主要談密碼找回。 我們可以選擇的密碼找回方案可能有以下幾種: 1. 用戶預(yù)設(shè)找回密碼問題,并且提供找回密碼答案。 2. 用戶通過email 找回密碼 .......................... 第一種方案或許是個很好的解決方案,但我們這次并不選擇此方案,其中的種種原因,也不在本討論之內(nèi)。我們用第二種方案作為本次的主要討論對象。 那么我們開始吧。 第二種方案的其中好處是: 1. 注冊用戶必須提供正確的郵箱,否則將不能使用系統(tǒng)所提供的密碼重設(shè)功能。 2. 必須由該用戶通過郵箱確認。 這可能對企業(yè)來說,是件好事。企業(yè)總是費勁心思的想得到用戶真實的詳細信息,以便進行有針對性的郵件列表服務(wù)。這也是這次開發(fā)用戶要求這樣做的一個主要原因。 我們可能會在login界面提供一個鏈接,或者在login失敗后提供一個鏈接。鏈接名當(dāng)然你可以自己定義了,我定義的是:忘了密碼,需要找回嗎? 當(dāng)用戶點擊找加密碼時,我們會提供一個input表單。讓用戶輸入用戶名(如果是login失敗后,我們可以用session填充表單內(nèi)容)。用戶點擊提交后,我們開始我們的密碼重設(shè)功能流程。 我們可能會創(chuàng)建這樣一個文件 send_reset_pass_mail.php。這個文件主要負責(zé)產(chǎn)生一個通過GET方法傳遞的字符串,并且將其發(fā)送出去。 代碼可能如下: PHP代碼: <?php /** * 我們假設(shè)你已經(jīng)在config.inc.php文件里配置好了你的sql信息,mail信息 */ require_once('config.inc.php');
/** * 你需要一下sendmail類來進行郵件發(fā)送,我們也假設(shè)你已經(jīng)配置好,并且能正發(fā)送郵件 */ require_once('sendMail.inc.php');
/** * 首先我們執(zhí)行查詢,得到此用戶的相關(guān)信息 * 你不要告訴我你不知道$_POST['username']是怎么得到的,如果是這樣,我郁悶一下你。 * 我使用了adodb的類,并且已經(jīng)在配置文件中聲明過 */ $username = trim($_POST['username']);
$sql = "select email,passwords from member where username = '".trim($_POST['username'])."'"; $userInfo = $db->FetchRow($sql);
$user_pass = $userInfo['passwords']; $user_email = $userInfo['email'];
/** * OK,一些需要的東西我們都有了,看來得進行下步操作了 * 現(xiàn)在讓我們產(chǎn)生一個經(jīng)過md5加密碼過的字符串,先不要問為什么,等會再告訴你 */
$x = md5($username.'+'.$passwords); //現(xiàn)在我們可以發(fā)送郵件給用戶了。當(dāng)然,我們還得需要另一個密碼重設(shè)程序 resetUserPass.php $String = base64_encode($username.".".$x);
$sendMail = new sendMail(); $subject = "你的密碼找回信"; $message = "尊敬的".$username."先生/女士:<br /> 你使用了本站提供的密碼找回功能,如果你確認此密碼找回功能是你啟用的,請點擊下面的鏈接,按流程進行密碼重設(shè)。<br><br>歡迎你經(jīng)常訪問本站。站長無喱頭謝謝你經(jīng)常光顧本站!<br><Br><a href='/resetUserPass.php?p=".$String.">確認密碼找回</a>";
if( $sendMail->mailto($user_email,$subject,$message) ) { //信息發(fā)送發(fā)功了,這里可以執(zhí)行其它動作。 } else { die("由于xx原因,你執(zhí)行的找回密碼未能成功!請登陸網(wǎng)站,與站長聯(lián)系。謝謝"); } ?>
|
那么好,我們的信件已經(jīng)成功發(fā)出了,哪么用戶得到了一個什么樣的鏈接呢? 可能如下: /resetUserPass.php?p=dT1saXRvdSZ4PTAwZTc1MGZlNmZjOGNkNGYyMjgzMDA3MWJlZDNmZTAw 用戶點擊過后,執(zhí)行我們站點的resetUserPass.php程序。 PHP代碼:
<?php require_once('config.inc.php'); /** * 用base64_decode解開$_GET['p']的值 */ $array = explode('.',base64_decode($_GET['p']));
/** * 這時,我們會得到一個數(shù)組,$array,里面分別存放了用戶名和我們需要一段字符串 * $array[0] 為用戶名 * $array[1] 為我們生成的字符串 */ //好了,我們開始進行匹配工作吧。
$sql = "select passwords from member where username = '".trim($_array['0'])."'";
$passwords = $db->GetOne($sql);
/** * 產(chǎn)生配置碼 */ $checkCode = md5($array['0'].'+'.$passwords);
/** * 進行配置驗證: => */
if( $array['1'] === $checkCode ){ //執(zhí)行重置程序,一般給出三個輸入框。 Echo "<input name=username value='".$array['0']."' onlyread>"; Echo "<input name=userpasswd type=password>"; Echo "<input name=reinput type=password>"; }else{ //給出定義錯誤頁面 }
//OK了,接下來的工作是我們進行數(shù)據(jù)庫更新了?這里就不再說了。。。 ?> |
然后用戶進行l(wèi)ogin。
|