邮箱找回密码功能
原理很簡(jiǎn)單:用戶找回密碼的時(shí)候,填寫(xiě)用戶名,程序得到用戶名便可以去數(shù)據(jù)庫(kù)取出用戶對(duì)應(yīng)的密碼以及當(dāng)時(shí)填寫(xiě)的郵箱,根據(jù)用戶名和密碼生成一個(gè)key=md5(username+password),然后$string=base64_encode(username+key),發(fā)送郵件給用戶,郵件內(nèi)容為http://www.xxx.com?p=$string,用戶點(diǎn)擊鏈接地址,程序進(jìn)行相關(guān)操作,先$str=base64_decode($string),之后$arr=explode('+',$str),$arr[0]肯定為用戶名,根據(jù)用戶名得到用戶的密碼,再使用key=md5(username+password),判斷$arr[1]與key是否一致,一致的話就輸出兩個(gè)表單,讓用戶填寫(xiě)新的密碼和確認(rèn)密碼。問(wèn)題一:會(huì)不會(huì)最后一步的輸入新的密碼的是,用戶把username改成別人的,然后再提交新的密碼過(guò)去?問(wèn)題二:為什么不直接在發(fā)送給用戶的郵箱里面地址這樣寫(xiě)http://www.xxx.com?username=xxx&key=$string ?答: 原理其實(shí)是一致的擴(kuò)展:一:如何讓這個(gè)找回密碼的鏈接具有時(shí)效性(比如15分鐘后失效)?答:原理:在地址欄上面加上一個(gè)時(shí)間和這個(gè)時(shí)間的加密,如果用戶點(diǎn)擊這個(gè)鏈接去處理的當(dāng)時(shí)時(shí)間-地址欄的時(shí)間大于15分鐘,則這個(gè)找回密碼的鏈接失效http://www.xxx.com?username=xxx&key=$string &code=md5("自己定義的常量串".$time)&time=$time其中code是用來(lái)檢驗(yàn)time是否有修改過(guò)。
第二種:
發(fā)送郵件找回密碼功能(分析加實(shí)例)(如有錯(cuò)誤請(qǐng)指出,謝謝) 分析:大致思路就是發(fā)送郵件→連接郵件里的URL→修改密碼1.為了保證安全性,需要生成發(fā)送到郵件的URL,主要參數(shù)(用戶名,過(guò)期時(shí)間,key(key 需要在每次運(yùn)行是自動(dòng)生成隨機(jī)碼), IP等等) 然后將URL發(fā)送到郵箱。2.保存發(fā)送的參數(shù)(建議保存在數(shù)據(jù)庫(kù))3.解析url:首先根據(jù)用戶名從數(shù)據(jù)庫(kù)中查找出密鑰key和過(guò)期時(shí)間,沒(méi)有則表示該請(qǐng)求 是偽造的或者過(guò)期的,然后驗(yàn)證簽名,驗(yàn)證過(guò)期時(shí)間,都驗(yàn)證通過(guò),就可以修改密碼, 密碼修改完以后,刪除數(shù)據(jù)庫(kù)中的記錄。 實(shí)例代碼: 分為發(fā)送郵箱頁(yè)面和修改密碼頁(yè)面:一.發(fā)送郵箱頁(yè)面string strUserName = txtUserName.Value.Trim();string strEail = txtEmail.Value.Trim();//生成隨機(jī)密碼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)){//發(fā)送郵件StringBuilder sb = new StringBuilder();sb.Append("親愛(ài)的" + strUserName + "您好:<br/><br/>");sb.Append("點(diǎn)擊以下鏈接設(shè)置新密碼。<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("(如果無(wú)法點(diǎn)擊該URL鏈接地址,請(qǐng)將它復(fù)制并粘帖到瀏覽器的地址輸入框,然后單擊回車(chē)即可。)<br/><br/>");sb.Append("注意:請(qǐng)您在收到郵件24小時(shí)內(nèi)使用,否則該鏈接將會(huì)失效。<br/><br/>");sb.Append("我們將一如既往、熱忱的為您服務(wù)!<br/><br/>");string MessageBody = sb.ToString();Sends(strEail, "no_reply@xxxx.com", "xxxx--找回密碼", MessageBody, "123456");//向find_password_log表添加數(shù)據(jù)AddFindPassword(strUserName, strEail,key);Response.Write("<script>alert('郵件已發(fā)送到你的郵箱,請(qǐng)注意查收!');location.href='/';</script>");}}//向表find_password_log中添加數(shù)據(jù)private void AddFindPassword(string strName, string email, string key){//向find_password_log表中插入隨機(jī)生成的密碼(MD5加密) ,時(shí)間,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);}//發(fā)送郵件代碼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;//指定電子郵件發(fā)送方式_smtpClient.Host = smtp; //指定SMTP服務(wù)器_smtpClient.Credentials = new System.Net.NetworkCredential(name, upass);//用戶名和密碼MailMessage _mailMessage = new MailMessage();//發(fā)件人,發(fā)件人名 _mailMessage.From = new MailAddress(formto, "xxxx公司");//收件人 _mailMessage.To.Add(email);_mailMessage.SubjectEncoding = System.Text.Encoding.GetEncoding("gb2312");_mailMessage.Subject = content;//主題_mailMessage.Body = body;//內(nèi)容_mailMessage.BodyEncoding = System.Text.Encoding.GetEncoding("gb2312");//正文編碼_mailMessage.IsBodyHtml = true;//設(shè)置為HTML格式_mailMessage.Priority = MailPriority.High;//優(yōu)先級(jí) try{_smtpClient.Send(_mailMessage);}catch (Exception){}}二,修改密碼頁(yè)。這個(gè)很簡(jiǎn)單咯,代碼就沒(méi)貼出來(lái)1根據(jù)接受的參數(shù)和數(shù)據(jù)中添加的參數(shù)進(jìn)行比較,如果驗(yàn)證通過(guò),就修改密碼,如果驗(yàn)證失敗則給出提示,重新發(fā)送郵件。
第二種:
發(fā)送郵件找回密碼功能(分析加實(shí)例)(如有錯(cuò)誤請(qǐng)指出,謝謝) 分析:大致思路就是發(fā)送郵件→連接郵件里的URL→修改密碼1.為了保證安全性,需要生成發(fā)送到郵件的URL,主要參數(shù)(用戶名,過(guò)期時(shí)間,key(key 需要在每次運(yùn)行是自動(dòng)生成隨機(jī)碼), IP等等) 然后將URL發(fā)送到郵箱。2.保存發(fā)送的參數(shù)(建議保存在數(shù)據(jù)庫(kù))3.解析url:首先根據(jù)用戶名從數(shù)據(jù)庫(kù)中查找出密鑰key和過(guò)期時(shí)間,沒(méi)有則表示該請(qǐng)求 是偽造的或者過(guò)期的,然后驗(yàn)證簽名,驗(yàn)證過(guò)期時(shí)間,都驗(yàn)證通過(guò),就可以修改密碼, 密碼修改完以后,刪除數(shù)據(jù)庫(kù)中的記錄。 實(shí)例代碼: 分為發(fā)送郵箱頁(yè)面和修改密碼頁(yè)面:一.發(fā)送郵箱頁(yè)面string strUserName = txtUserName.Value.Trim();string strEail = txtEmail.Value.Trim();//生成隨機(jī)密碼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)){//發(fā)送郵件StringBuilder sb = new StringBuilder();sb.Append("親愛(ài)的" + strUserName + "您好:<br/><br/>");sb.Append("點(diǎn)擊以下鏈接設(shè)置新密碼。<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("(如果無(wú)法點(diǎn)擊該URL鏈接地址,請(qǐng)將它復(fù)制并粘帖到瀏覽器的地址輸入框,然后單擊回車(chē)即可。)<br/><br/>");sb.Append("注意:請(qǐng)您在收到郵件24小時(shí)內(nèi)使用,否則該鏈接將會(huì)失效。<br/><br/>");sb.Append("我們將一如既往、熱忱的為您服務(wù)!<br/><br/>");string MessageBody = sb.ToString();Sends(strEail, "no_reply@xxxx.com", "xxxx--找回密碼", MessageBody, "123456");//向find_password_log表添加數(shù)據(jù)AddFindPassword(strUserName, strEail,key);Response.Write("<script>alert('郵件已發(fā)送到你的郵箱,請(qǐng)注意查收!');location.href='/';</script>");}}//向表find_password_log中添加數(shù)據(jù)private void AddFindPassword(string strName, string email, string key){//向find_password_log表中插入隨機(jī)生成的密碼(MD5加密) ,時(shí)間,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);}//發(fā)送郵件代碼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;//指定電子郵件發(fā)送方式_smtpClient.Host = smtp; //指定SMTP服務(wù)器_smtpClient.Credentials = new System.Net.NetworkCredential(name, upass);//用戶名和密碼MailMessage _mailMessage = new MailMessage();//發(fā)件人,發(fā)件人名 _mailMessage.From = new MailAddress(formto, "xxxx公司");//收件人 _mailMessage.To.Add(email);_mailMessage.SubjectEncoding = System.Text.Encoding.GetEncoding("gb2312");_mailMessage.Subject = content;//主題_mailMessage.Body = body;//內(nèi)容_mailMessage.BodyEncoding = System.Text.Encoding.GetEncoding("gb2312");//正文編碼_mailMessage.IsBodyHtml = true;//設(shè)置為HTML格式_mailMessage.Priority = MailPriority.High;//優(yōu)先級(jí) try{_smtpClient.Send(_mailMessage);}catch (Exception){}}二,修改密碼頁(yè)。這個(gè)很簡(jiǎn)單咯,代碼就沒(méi)貼出來(lái)1根據(jù)接受的參數(shù)和數(shù)據(jù)中添加的參數(shù)進(jìn)行比較,如果驗(yàn)證通過(guò),就修改密碼,如果驗(yàn)證失敗則給出提示,重新發(fā)送郵件。
總結(jié)
- 上一篇: python flask智能租房项目——
- 下一篇: 汽车诊断之UDS入门-DTC(Diagn