邮箱找回密码功能

标签: 邮箱 base64
3476人阅读 评论(4) 收藏 举报
分类:
原理很简单:

用户找回密码的时候,填写用户名,程序得到用户名便可以去数据库取出用户对应的密码以及当时填写的邮箱,

根据用户名和密码生成一个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加密) ,时间,IP
        SummerBase.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根据接受的参数和数据中添加的参数进行比较,如果验证通过,就修改密码,如果验证失败则给出提示,重新发送邮件。

查看评论

邮箱找回密码功能实现思路

发送邮件功能实现参见        当用户找回密码时,向用户邮箱发送一个链接,通过该链接用户可以转到密码重置界面,为了防止非法用户利用用户名然后直接访问该密码重置界面修改用户密码,发送到邮箱的链接可以...
  • gaibian_one
  • gaibian_one
  • 2016-11-10 21:42:30
  • 1071

通过邮件找回密码功能的实现

1、最近开发一个系统,有个需求就是,忘记密码后通过邮箱找回。现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回。通过java发送邮件的功能我就不说了,重点讲找回密...
  • zhujunxxxxx
  • zhujunxxxxx
  • 2013-10-19 12:20:12
  • 9126

JAVA实现通过绑定邮箱找回密码功能

1.输入用户名及验证码,验证用户名是否存在 (1).生成验证码工具类 package com.utils; import java.awt.Color; ...
  • qq_35447305
  • qq_35447305
  • 2016-11-18 22:21:55
  • 7780

发送邮箱实现找回密码

注意事项 1、.开启socket:在php.ini中取消extension=php_sockets.dll前面的分号。 2.登录你的邮箱手动开启STMP服务,这个服务默认是关闭的,一定要去邮箱->...
  • xiesumin
  • xiesumin
  • 2015-08-15 10:07:25
  • 3215

账号通过邮箱找回密码功能设计

通常所说的密码找回功能不是真的能把忘记的密码找回,因为我们的密码是加密保存的,一般开发者会在验证用户信息后通过程序生成一个新密码或者生成一个特定的链接并发送邮件到用户邮箱,用户从邮箱链接到网站的重置密...
  • u013372487
  • u013372487
  • 2016-09-02 18:10:01
  • 6258

Java通过邮箱找回密码和注册

  • 2015年08月20日 17:35
  • 810KB
  • 下载

通过邮箱找回密码的实现

找回密码的实现方式 (2009-12-23 14:34:34) 转载▼ 标签: it 分类: 总结心得 现在的论坛、社区等需要注册的地方都有个功...
  • zhangzhifei1991
  • zhangzhifei1991
  • 2014-09-17 09:42:33
  • 1554

找回密码功能逻辑

1.表单输入注册时的邮箱; 2.验证用户邮箱是否正确,如果用户邮箱不存在网站的用户表中,则提示用户邮箱未注册; 3.发送邮件,如果用户邮箱确实存在用户表中,则组合用于验证用户信息的字符串,...
  • daijiguo
  • daijiguo
  • 2016-03-03 11:35:30
  • 2039

邮箱

邮箱是µC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。为了在µC/OS-II中使用邮箱,必须将OS_C...
  • FunkyFrog821951259
  • FunkyFrog821951259
  • 2017-04-01 10:33:15
  • 459

邮箱mail.jar

  • 2014年07月21日 15:20
  • 509KB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 14万+
    积分: 2222
    排名: 2万+
    文章存档
    最新评论