• 网站开发之用户重设密码 找回密码功能的实现原理


    网站开发之用户重设密码 找回密码功能的实现原理,这个东西基本在现在每个系统中都带有的功能,但是实现的方式也是挺多的,这个是跟数据库没多大关系的方法嘞。

     
      用户流程:
     
      1.用户忘记密码,来到密码重设界面
     
      2.用户输入Email地址,点击重设密码按钮
     
      3.用户收到一封密码重设邮件,里面有重设密码的链接,此链接有过期时间
     
      4.用户点击链接,来到密码重设页面,输入新密码,完成
     
      这个流程并没有什么创新,很多网站都是用这套流程
     
      后端实现方式:
     
      1.当用户输入Email地址后,验证这个Email,如果存在于数据库,那么取得用户的user_id
     
      2.将user_id和当前时间戳编码成HASH,需要提前准备好一个KEY,并且这个KEY只存在服务器上。 HASH = md5 ( user_id + timestamp + KEY )
     
      3.生成一个URL,并且附带刚刚生成的HASH和用户id以及timestamp,比如 http://domain.com/reset-password.php?hash=HASH&user_id=123×tamp=1392121211
     
      4.当-三-联-用户访问这个URL, 检查HASH是否合法: HASH == MD5 ( user_id + timestamp + KEY)
     
      5.检查 timestamp 是不是过期了
     
      6.如果所有检查通过,那么显示一个新密码表单给用户
     
      这种方式的好处:
     
      1.不需要额外的数据表
     
      2.不用担心参数被用户恶意修改,因为要检查hash是不是等于那几个参数的md5
     
      3.密码重设URL自带时间戳
     
      4.只要KEY设置的足够长足够复杂,那么可以认为HASH是绝对安全的
     
      例
     
      send-reset-email.php:
     代码如下  复制代码
     
     
    $KEY = "something really long long long long long and secret";
    $email = $_POST['email'];
    $user = get_user_by_email($email);
    if ($user && $user['id'])
    {
        $time = time();
        $hash = md5( $user['id'] . $time . $KEY);
        $url = "http://domain.com/reset-password-form.php?id=".$user['id'].'&timestamp='.$time.'&hash='.$hash;
        send_email($email, 'reset password email from xxx.com', ' Please click the following link to reset password'. $url);
    }
     
      reset-password-form.php:
     代码如下  复制代码
     
     
    $KEY = "something really long long long long long and secret";
    $hash = $_GET['hash'];
    $user_id = $_GET['id'];
    $timestamp = $_GET['timestamp'];
     
    if ($hash == md5( $user_id . $timestamp . $KEY ))
    {
        if ( time() - $timestamp > 3600 ) // one hour
        {
            die('link expired');
        }
    }
    else
    {
        die('invalid parameters');
    }
     
    //validation passed
     
    if ($_POST['new_password'])
    {
        reset_user_password($user_id, $_POST['new_password']);
        die(' password changed successfully ');
    }
    else
    {
        echo '
            <form action="reset-password-form.php?hash=$hash&id=$user_id&timestamp=$timestamp" method="post">
                new password: <input type="password" name="new_password">
     
                <input type="submit" value="submit">
            </form>
        ';
    }
  • 相关阅读:
    JS中数组的sort()排序
    清除浮动方法
    浏览器兼容问题
    前端切图
    设置页面默认为繁体字
    7月计划
    css的层叠和继承
    Flex 布局教程:语法篇
    轮播图淡入淡出的js和jquery的效果
    接口调用async/await
  • 原文地址:https://www.cnblogs.com/wolfocme110/p/4663300.html
Copyright © 2020-2023  润新知