邮箱找回密码功能
原理很簡單:用戶找回密碼的時候,填寫用戶名,程序得到用戶名便可以去數據庫取出用戶對應的密碼以及當時填寫的郵箱,根據用戶名和密碼生成一個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是否有修改過。
第二種:
發送郵件找回密碼功能(分析加實例)(如有錯誤請指出,謝謝) 分析:大致思路就是發送郵件→連接郵件里的URL→修改密碼1.為了保證安全性,需要生成發送到郵件的URL,主要參數(用戶名,過期時間,key(key 需要在每次運行是自動生成隨機碼), IP等等) 然后將URL發送到郵箱。2.保存發送的參數(建議保存在數據庫)3.解析url:首先根據用戶名從數據庫中查找出密鑰key和過期時間,沒有則表示該請求 是偽造的或者過期的,然后驗證簽名,驗證過期時間,都驗證通過,就可以修改密碼, 密碼修改完以后,刪除數據庫中的記錄。 實例代碼: 分為發送郵箱頁面和修改密碼頁面:一.發送郵箱頁面string strUserName = txtUserName.Value.Trim();string strEail = txtEmail.Value.Trim();//生成隨機密碼string rand = "";Random ramPwd = new Random();string pwd = ramPwd.Next(100000, 9999999).ToString();rand = pwd;string key = rand + strName + email + "Base";if (!string.IsNullOrEmpty(strUserName) && !string.IsNullOrEmpty(strEail)){//發送郵件StringBuilder sb = new StringBuilder();sb.Append("親愛的" + strUserName + "您好:<br/><br/>");sb.Append("點擊以下鏈接設置新密碼。<br/><br/>");sb.Append("<a href =\"http://www.xxxx.com/findpwd.aspx?key=" + key + "&time=" + time + "\">http://www.xxxx.com/findpwd.aspx?key=" + key + "&time=" + time + " </a><br/><br/>");sb.Append("(如果無法點擊該URL鏈接地址,請將它復制并粘帖到瀏覽器的地址輸入框,然后單擊回車即可。)<br/><br/>");sb.Append("注意:請您在收到郵件24小時內使用,否則該鏈接將會失效。<br/><br/>");sb.Append("我們將一如既往、熱忱的為您服務!<br/><br/>");string MessageBody = sb.ToString();Sends(strEail, "no_reply@xxxx.com", "xxxx--找回密碼", MessageBody, "123456");//向find_password_log表添加數據AddFindPassword(strUserName, strEail,key);Response.Write("<script>alert('郵件已發送到你的郵箱,請注意查收!');location.href='/';</script>");}}//向表find_password_log中添加數據private void AddFindPassword(string strName, string email, string key){//向find_password_log表中插入隨機生成的密碼(MD5加密) ,時間,IPSummerBase.BLL.find_password_log bllFind = new SummerBase.BLL.find_password_log();SummerBase.Model.find_password_log modelFind = new SummerBase.Model.find_password_log();if (modelFind != null){modelFind.Md5 = MFunction.Md5New(key).ToString();modelFind.CreateTime = SummerBase.Utils.Util.TimeToUnixTimes(DateTime.Now.ToString());modelFind.IP = Page.Request.UserHostAddress;time = modelFind.CreateTime;key = modelFind.Md5;}bllFind.Add(modelFind);}//發送郵件代碼public static void Sends(string email, string formto, string content, string body, string upass){string name = "no_reply@xxxx.com";string smtp = "smtp.exmail.sina.com";SmtpClient _smtpClient = new SmtpClient();_smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定電子郵件發送方式_smtpClient.Host = smtp; //指定SMTP服務器_smtpClient.Credentials = new System.Net.NetworkCredential(name, upass);//用戶名和密碼MailMessage _mailMessage = new MailMessage();//發件人,發件人名 _mailMessage.From = new MailAddress(formto, "xxxx公司");//收件人 _mailMessage.To.Add(email);_mailMessage.SubjectEncoding = System.Text.Encoding.GetEncoding("gb2312");_mailMessage.Subject = content;//主題_mailMessage.Body = body;//內容_mailMessage.BodyEncoding = System.Text.Encoding.GetEncoding("gb2312");//正文編碼_mailMessage.IsBodyHtml = true;//設置為HTML格式_mailMessage.Priority = MailPriority.High;//優先級 try{_smtpClient.Send(_mailMessage);}catch (Exception){}}二,修改密碼頁。這個很簡單咯,代碼就沒貼出來1根據接受的參數和數據中添加的參數進行比較,如果驗證通過,就修改密碼,如果驗證失敗則給出提示,重新發送郵件。
第二種:
發送郵件找回密碼功能(分析加實例)(如有錯誤請指出,謝謝) 分析:大致思路就是發送郵件→連接郵件里的URL→修改密碼1.為了保證安全性,需要生成發送到郵件的URL,主要參數(用戶名,過期時間,key(key 需要在每次運行是自動生成隨機碼), IP等等) 然后將URL發送到郵箱。2.保存發送的參數(建議保存在數據庫)3.解析url:首先根據用戶名從數據庫中查找出密鑰key和過期時間,沒有則表示該請求 是偽造的或者過期的,然后驗證簽名,驗證過期時間,都驗證通過,就可以修改密碼, 密碼修改完以后,刪除數據庫中的記錄。 實例代碼: 分為發送郵箱頁面和修改密碼頁面:一.發送郵箱頁面string strUserName = txtUserName.Value.Trim();string strEail = txtEmail.Value.Trim();//生成隨機密碼string rand = "";Random ramPwd = new Random();string pwd = ramPwd.Next(100000, 9999999).ToString();rand = pwd;string key = rand + strName + email + "Base";if (!string.IsNullOrEmpty(strUserName) && !string.IsNullOrEmpty(strEail)){//發送郵件StringBuilder sb = new StringBuilder();sb.Append("親愛的" + strUserName + "您好:<br/><br/>");sb.Append("點擊以下鏈接設置新密碼。<br/><br/>");sb.Append("<a href =\"http://www.xxxx.com/findpwd.aspx?key=" + key + "&time=" + time + "\">http://www.xxxx.com/findpwd.aspx?key=" + key + "&time=" + time + " </a><br/><br/>");sb.Append("(如果無法點擊該URL鏈接地址,請將它復制并粘帖到瀏覽器的地址輸入框,然后單擊回車即可。)<br/><br/>");sb.Append("注意:請您在收到郵件24小時內使用,否則該鏈接將會失效。<br/><br/>");sb.Append("我們將一如既往、熱忱的為您服務!<br/><br/>");string MessageBody = sb.ToString();Sends(strEail, "no_reply@xxxx.com", "xxxx--找回密碼", MessageBody, "123456");//向find_password_log表添加數據AddFindPassword(strUserName, strEail,key);Response.Write("<script>alert('郵件已發送到你的郵箱,請注意查收!');location.href='/';</script>");}}//向表find_password_log中添加數據private void AddFindPassword(string strName, string email, string key){//向find_password_log表中插入隨機生成的密碼(MD5加密) ,時間,IPSummerBase.BLL.find_password_log bllFind = new SummerBase.BLL.find_password_log();SummerBase.Model.find_password_log modelFind = new SummerBase.Model.find_password_log();if (modelFind != null){modelFind.Md5 = MFunction.Md5New(key).ToString();modelFind.CreateTime = SummerBase.Utils.Util.TimeToUnixTimes(DateTime.Now.ToString());modelFind.IP = Page.Request.UserHostAddress;time = modelFind.CreateTime;key = modelFind.Md5;}bllFind.Add(modelFind);}//發送郵件代碼public static void Sends(string email, string formto, string content, string body, string upass){string name = "no_reply@xxxx.com";string smtp = "smtp.exmail.sina.com";SmtpClient _smtpClient = new SmtpClient();_smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定電子郵件發送方式_smtpClient.Host = smtp; //指定SMTP服務器_smtpClient.Credentials = new System.Net.NetworkCredential(name, upass);//用戶名和密碼MailMessage _mailMessage = new MailMessage();//發件人,發件人名 _mailMessage.From = new MailAddress(formto, "xxxx公司");//收件人 _mailMessage.To.Add(email);_mailMessage.SubjectEncoding = System.Text.Encoding.GetEncoding("gb2312");_mailMessage.Subject = content;//主題_mailMessage.Body = body;//內容_mailMessage.BodyEncoding = System.Text.Encoding.GetEncoding("gb2312");//正文編碼_mailMessage.IsBodyHtml = true;//設置為HTML格式_mailMessage.Priority = MailPriority.High;//優先級 try{_smtpClient.Send(_mailMessage);}catch (Exception){}}二,修改密碼頁。這個很簡單咯,代碼就沒貼出來1根據接受的參數和數據中添加的參數進行比較,如果驗證通過,就修改密碼,如果驗證失敗則給出提示,重新發送郵件。
總結
- 上一篇: python flask智能租房项目——
- 下一篇: 汽车诊断之UDS入门-DTC(Diagn