随笔 - 432  文章 - 0  评论 - 15  阅读 - 63万

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

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

 
  用户流程:
 
  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>
    ';
}
posted on   狼来了  阅读(1486)  评论(1编辑  收藏  举报
编辑推荐:
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
阅读排行:
· 10亿数据,如何做迁移?
· 推荐几款开源且免费的 .NET MAUI 组件库
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 易语言 —— 开山篇
· Trae初体验
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示