筆者前段接了一個項目,其中包含了一個用戶注冊系統,用到了密碼找回功能,簡單整理一下,寫點心得。
首先,我們假定你已經有了一個用戶注冊系統。其中用戶表可能如下:
create table member(
id int unsigned not null auto_incremtnt,
username………………
passwords char(32) not null,
email varchar(100) not null,
……………………………..
);
現在討論的焦點不是數據庫設計,我們主要談密碼找回。
我們可以選擇的密碼找回方案可能有以下幾種:
1. 用戶預設找回密碼問題,並且提供找回密碼答案。
2. 用戶通過email 找回密碼
..........................
第一種方案或許是個很好的解決方案,但我們這次並不選擇此方案,其中的種種原因,也不在本討論之內。我們用第二種方案作為本次的主要討論對象。
那麼我們開始吧。
第二種方案的其中好處是:
1. 注冊用戶必須提供正確的郵箱,否則將不能使用系統所提供的密碼重設功能。
2. 必須由該用戶通過郵箱確認。
這可能對企業來說,是件好事。企業總是費勁心思的想得到用戶真實的具體信息,以便進行有針對性的郵件列表服務。這也是這次開發用戶要求這樣做的一個主要原因。
我們可能會在login界面提供一個鏈接,或者在login失敗後提供一個鏈接。鏈接名當然你可以自己定義了,我定義的是:忘了密碼,需要找回嗎?
當用戶點擊找加密碼時,我們會提供一個input表單。讓用戶輸入用戶名(假如是login失敗後,我們可以用session填充表單內容)。用戶點擊提交後,我們開始我們的密碼重設功能流程。
我們可能會創建這樣一個文件 send_reset_pass_mail.php。這個文件主要負責產生一個通過GET方法傳遞的字符串,並且將其發送出去。
代碼可能如下:
PHP代碼:
<?php
/**
* 我們假設你已經在config.inc.php文件裡配置好了你的sql信息,mail信息
*/
require_once('config.inc.php');
/**
* 你需要一下sendmail類來進行郵件發送,我們也假設你已經配置好,並且能正發送郵件
*/
require_once('sendMail.inc.php');
/**
* 首先我們執行查詢,得到此用戶的相關信息
* 你不要告訴我你不知道$_POST['username']是怎麼得到的,假如是這樣,我郁悶一下你。
* 我使用了adodb的類,並且已經在配置文件中聲明過
*/
$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,一些需要的東西我們都有了,看來得進行下步操作了
* 現在讓我們產生一個經過md5加密碼過的字符串,先不要問為什麼,等會再告訴你
*/
$x = md5($username.' '.$passwords);
//現在我們可以發送郵件給用戶了。當然,我們還得需要另一個密碼重設程序 resetUserPass.php
$String = base64_encode($username.".".$x);