paip.找回密码功能流程设计(通过email)
找回口令的功能
找回口令的功能一定要提供。但是很多朋友并不知道怎么来设计这个功能。我们有很多找回口令的设计,下面我逐个点评一下。
不要重置用户的密码。因为这有可能让用户的密码遭到恶意攻击。当然,你要发个邮件给用户让其确认,用户点击邮件中的一个链接,你再重置。我并不推荐这样的方法,因为用户一般都会用笔记下来这个很难记的口令,然后登录系统,因为登录系统时使用了“记住密码”的功能,所以导致用户不会去修改密码,从而要么导到被写下来的密码被人盗取,要么又忘记了密码。
好一点的做法——通过邮件自行重置。当用户申请找回口令功能的时候,系统生成一个MD5唯一的随机字串(可通过UID+IP+timestamp+随机数),放在数据库中,然后设置上时限(比如48小时内),给用户发一个邮件,这个连接中包含那个MD5的字串的链接,用户通过点击那个链接来自己重新设置新的口令。
此连接单次使用
伪码设计
uname=input()
$md5str=md5(uname+ip+timestamp+ramode+key)
$unameEncode=3des(uname+key)
url=http://host:port/app/resetPwd.jsp?sign=$md5str&u=$unameEncode
$emailtxt= getTemplete(c:\templete.htm)
$emailtxt= replace(@username,@url)
sendmail($emailtxt);
save(uname,$md5str,nowtime)
log(uname,time,event:findbackpwd)
/user recepte mail.open mailbox ,click to resetPwd.jsp
check()
{
$uname=un3des( getpara(u));
$sign=getpara(sign);
if(NOTexist( $sign,$uname))
tips (no this href) ;exit;
if(outtime($sign,$uname))
tips (only 48 hr avild) ;exit;
}
show (uname,textbox:pwd,texbox:pwd2)
//when submit
check()
$uname=getRec($sign,un3des($unameEncode))
resetPwd( $uname,$newpwd,$newpwd2);
deleteSave($sign,$uname) //confirm only signle use
更好一点的做法——多重认证。比如:通过手机+邮件的
方式让用户输入验证码。手机+邮件可能还不把握,因为手机要能会丢了,而我的手机可以访问我的邮箱。所以,使用U盾,SecureID(一个会变化的6位数token),或是通过人工的方式核实用户身份。当然,这主要看你的系统的安全级别了。