原理很簡單:
用戶找回密碼的時候,填寫用戶名,程序得到用戶名便可以去數據庫取出用戶對應的密碼以及當時填寫的郵箱,
根據用戶名和密碼生成一個key=md5(username+password),然后$string=base64_encode(username+key),發送郵件給用戶,郵件內容為http://www.xxx.com?p=$string,
用戶點擊鏈接地址,程序進行相關操作,先$str=base64_decode($string),之 后$arr=explode('+',$str),$arr[0]肯定為用戶名,根據用戶名得到用戶的密碼,再使用 key=md5(username+password),判斷$arr[1]與key是否一致,一致的話就輸出兩個表單,讓用戶填寫新的密碼和確認密碼。
問題一:
會不會最后一步的輸入新的密碼的是,用戶把username改成別人的,然后再提交新的密碼過去?
問題二:
為什么不直接在發送給用戶的郵箱里面地址這樣寫http://www.xxx.com?username=xxx&key=$string ?
答: 原理其實是一致的
擴展:
一:如何讓這個找回密碼的鏈接具有時效性(比如15分鍾后失效)?
答:原理:在地址欄上面加上一個時間和這個時間的加密,如果用戶點擊這個鏈接去處理的當時時間-地址欄的時間大於15分鍾,則這個找回密碼的鏈接失效
http://www.xxx.com?username=xxx&key=$string &code=md5("自己定義的常量串".$time)&time=$time
其中code是用來檢驗time是否有修改過。
二:
將user_id換成別的user_id會不會就修改了別的用戶的密碼?
答:不會,因為其實在點擊鏈接過去的時候,就已經在session里面存儲了user_id,所以在接收input傳來的user_id的時候,我們會判斷是否和session里面的user_id一致,如果不一致的話,就以session里面的user_Id為准