因为要做一个带有会员系统功能,本人需要设置的是用户注册如果忘记密码就需要重设置密码了,那么要如何设计密码重设功能?怎么做才合理呢,下面我们一起来看看。VKEHTML5中文学习网 - HTML5先行者学习网
  用户流程:VKEHTML5中文学习网 - HTML5先行者学习网
  1.用户忘记密码,来到密码重设界面VKEHTML5中文学习网 - HTML5先行者学习网
  2.用户输入Email地址,点击重设密码按钮VKEHTML5中文学习网 - HTML5先行者学习网
  3.用户收到一封密码重设邮件,里面有重设密码的链接,此链接有过期时间VKEHTML5中文学习网 - HTML5先行者学习网
  4.用户点击链接,来到密码重设页面,输入新密码,完成VKEHTML5中文学习网 - HTML5先行者学习网
  这个流程并没有什么创新,很多网站都是用这套流程VKEHTML5中文学习网 - HTML5先行者学习网
  后端实现方式:VKEHTML5中文学习网 - HTML5先行者学习网
  1.当用户输入Email地址后,验证这个Email,如果存在于数据库,那么取得用户的user_idVKEHTML5中文学习网 - HTML5先行者学习网
  2.将user_id和当前时间戳编码成HASH,需要提前准备好一个KEY,并且这个KEY只存在服务器上。 HASH = md5 ( user_id +  timestamp + KEY )VKEHTML5中文学习网 - HTML5先行者学习网
  3.生成一个URL,并且附带刚刚生成的HASH和用户id以及timestamp,比如  http://domain.com/reset-password.php?hash=HASH&user_id=123×tamp=1392121211VKEHTML5中文学习网 - HTML5先行者学习网
  4.当-三-联-用户访问这个URL, 检查HASH是否合法: HASH == MD5 ( user_id + timestamp + KEY)VKEHTML5中文学习网 - HTML5先行者学习网
  5.检查 timestamp 是不是过期了VKEHTML5中文学习网 - HTML5先行者学习网
  6.如果所有检查通过,那么显示一个新密码表单给用户VKEHTML5中文学习网 - HTML5先行者学习网
  这种方式的好处:VKEHTML5中文学习网 - HTML5先行者学习网
  1.不需要额外的数据表VKEHTML5中文学习网 - HTML5先行者学习网
  2.不用担心参数被用户恶意修改,因为要检查hash是不是等于那几个参数的md5VKEHTML5中文学习网 - HTML5先行者学习网
  3.密码重设URL自带时间戳VKEHTML5中文学习网 - HTML5先行者学习网
  4.只要KEY设置的足够长足够复杂,那么可以认为HASH是绝对安全的VKEHTML5中文学习网 - HTML5先行者学习网
  例VKEHTML5中文学习网 - HTML5先行者学习网
  send-reset-email.php:VKEHTML5中文学习网 - HTML5先行者学习网
                        |  代码如下 |             复制代码 |         
                    |              VKEHTML5中文学习网 - HTML5先行者学习网             $KEY  = "something really long long long long long and secret";VKEHTML5中文学习网 - HTML5先行者学习网             $email =  $_POST['email'];VKEHTML5中文学习网 - HTML5先行者学习网             $user = get_user_by_email($email);VKEHTML5中文学习网 - HTML5先行者学习网             if ($user &&  $user['id'])VKEHTML5中文学习网 - HTML5先行者学习网             {VKEHTML5中文学习网 - HTML5先行者学习网                 $time = time();VKEHTML5中文学习网 - HTML5先行者学习网                 $hash = md5( $user['id'] . $time  . $KEY);VKEHTML5中文学习网 - HTML5先行者学习网                 $url =  "http://domain.com/reset-password-form.php?id=".$user['id'].'×tamp='.$time.'&hash='.$hash;VKEHTML5中文学习网 - HTML5先行者学习网                  send_email($email, 'reset password email from xxx.com', ' Please click the  following link to reset password'. $url);VKEHTML5中文学习网 - HTML5先行者学习网             }VKEHTML5中文学习网 - HTML5先行者学习网              |         
    
  reset-password-form.php:VKEHTML5中文学习网 - HTML5先行者学习网
                        |  代码如下 |             复制代码 |         
                    |              VKEHTML5中文学习网 - HTML5先行者学习网             $KEY  = "something really long long long long long and secret";VKEHTML5中文学习网 - HTML5先行者学习网             $hash =  $_GET['hash'];VKEHTML5中文学习网 - HTML5先行者学习网             $user_id = $_GET['id'];VKEHTML5中文学习网 - HTML5先行者学习网             $timestamp =  $_GET['timestamp'];VKEHTML5中文学习网 - HTML5先行者学习网             if  ($hash == md5( $user_id . $timestamp . $KEY ))VKEHTML5中文学习网 - HTML5先行者学习网             {VKEHTML5中文学习网 - HTML5先行者学习网                 if ( time() -  $timestamp > 3600 ) // one hourVKEHTML5中文学习网 - HTML5先行者学习网                 {VKEHTML5中文学习网 - HTML5先行者学习网                     die('link  expired');VKEHTML5中文学习网 - HTML5先行者学习网                 }VKEHTML5中文学习网 - HTML5先行者学习网             }VKEHTML5中文学习网 - HTML5先行者学习网             elseVKEHTML5中文学习网 - HTML5先行者学习网             {VKEHTML5中文学习网 - HTML5先行者学习网                 die('invalid parameters');VKEHTML5中文学习网 - HTML5先行者学习网             }VKEHTML5中文学习网 - HTML5先行者学习网             //validation  passedVKEHTML5中文学习网 - HTML5先行者学习网             if  ($_POST['new_password'])VKEHTML5中文学习网 - HTML5先行者学习网             {VKEHTML5中文学习网 - HTML5先行者学习网                 reset_user_password($user_id,  $_POST['new_password']);VKEHTML5中文学习网 - HTML5先行者学习网                 die(' password changed successfully  ');VKEHTML5中文学习网 - HTML5先行者学习网             }VKEHTML5中文学习网 - HTML5先行者学习网             elseVKEHTML5中文学习网 - HTML5先行者学习网             {VKEHTML5中文学习网 - HTML5先行者学习网                 echo 'VKEHTML5中文学习网 - HTML5先行者学习网                     <form  action="reset-password-form.php?hash=$hash&id=$user_id×tamp=$timestamp"  method="post">VKEHTML5中文学习网 - HTML5先行者学习网                         new password: <input type="password"  name="new_password">VKEHTML5中文学习网 - HTML5先行者学习网                          <input type="submit" value="submit">VKEHTML5中文学习网 - HTML5先行者学习网                     </form>VKEHTML5中文学习网 - HTML5先行者学习网                  ';VKEHTML5中文学习网 - HTML5先行者学习网             }VKEHTML5中文学习网 - HTML5先行者学习网              |