如何设计密码重设功能?找回密码设计原理

用户流程:

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&timestamp=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>
    ';
}

时间: 2024-12-27 09:09:01

如何设计密码重设功能?找回密码设计原理的相关文章

网站如何设计用户密码重设功能

因为要做一个带有会员系统功能,本人需要设置的是用户注册如果忘记密码就需要重设置密码了,那么要如何设计密码重设功能?怎么做才合理呢,下面我们一起来看看. 用户流程: 1.用户忘记密码,来到密码重设界面 2.用户输入Email地址,点击重设密码按钮 3.用户收到一封密码重设邮件,里面有重设密码的链接,此链接有过期时间 4.用户点击链接,来到密码重设页面,输入新密码,完成 这个流程并没有什么创新,很多网站都是用这套流程 后端实现方式: 1.当用户输入Email地址后,验证这个Email,如果存在于数据

Windows Server 2008密码重设盘功能详解

windows server 2008提供了一个密码重设盘的功能,可以通过创建一个软盘来作为忘记密码后重设用户密码的作用. 使用操作系统总免不了要对用户设置密码,为了保障安全性,一般还要求密码要符合复杂性的要求.而由于记忆力的问题,8630.html">有时候会出现我们忘记了用户密码而无法进入系统的情况. Windows server 2008提供了一个密码重设盘的功能,可以通过创建一个软盘来作为忘记密码后重设用户密码的作用. 在系统安装完成后,Windows 2008会要求我们输入一个a

破解WINDOWSXP/2000/2003登录密码/去掉登录密码/重设登录密码的方法总结_应用技巧

破解WINDOWSXP/2000/2003/98/ME的密码方法真的是多,所以说,Microsoft的Windows漏洞真的是多!不过这样也方便了很多用户对计算机的管理,有利也有弊! 很多朋友也咨询过此类问题很多次,每次我得要一个个回答,所以今天我就把方法综合一下,希望对大家有些实用的价值吧!  www.jb51.net 首先从简单的说起: 对于可以进入系统,然后又有管理权限的用户要破解Administrator内制管理用户的密码: 右键|我的电脑,选择"管理" 进入"计算机

忘记电脑密码怎么办,Win7密码重设盘帮你解决

为了保护个人数据,多数网友都会对自己的电脑设置登陆密码.但凡事有好的一面也会有坏的一面,如果一不小心搞错了密码,就会是一件非常郁闷的事情.不过,Win7的用户不用担心这个问题,只要你有一个U盘或是软盘,在Win7的重设密码盘的功能下,就可以轻松搞定这一问题了.一起来学习一下吧. 1.在控制面板中点击"用户账户",选择左手边的"创建密码重设盘". 图一 2.此时如果没有将U盘或软盘放入电脑,则会弹出以下界面.所以,请谨记"密码重设盘"是一定要在有U

Windows Server 2008密码重设盘

Windows server 2008提供了一个密码重设盘的功能,可以通过创建一个软盘来作为忘记密码后重设用户密码的作用. 在系统安装完成后,Windows 2008会要求我们输入一个administrator的初始密码.而在密码框的下方,就有一个"创建密码重设盘"的链接.点击后即可开始创建一个密码重设盘. 除了在系统安装完成的时候创建密码重设盘外,我们也可以在其他有需要的时候再进行创建:在"控制面板"中打开"用户帐户",在左边的任务栏中选中&q

Win7如何创建密码重设盘

创建密码重设盘的方法: 1 首先需要为当前用户账户创建一个密码. 2 单击控制面板?D用户账户?D创建密码重设盘 3 在弹出的忘记密码向导中单击下一步. 4 选择U盘,单击下一步. 5 输入当前用户账户的密码,单击下一步. 6 等待几秒钟出现完成的提示,单击下一步.

用密码重设盘设新密码_密码恢复攻略

用密码重设盘设新密码     在没有使用"欢迎屏幕"登录方式的情况下登录到Windows XP后.按下"Ctrl+Alt+Del"组合键,出现"Windows 安全"窗口,点击选项中"更改密码"按钮,出现更改密码窗口(图1).这个窗口中,将当前用户的密码备份,点击左下角"备份"按钮激活"忘记密码向导",按照提示创建密码重设盘.     如果在Windows XP的登录窗口输入了错误的密码

彩云忘记密码怎么办(怎么找回密码)?

  如果您忘记密码,可使用短信密码登录,也可使用找回密码功能.您可在彩云任意客户端的登录页面,点击"找回密码"(或"忘记密码"),按照提示内容操作,即可找回密码.

mac教程:单用户模式如何重设mac管理员密码

  近日,锋友langren34分享了一个关于在Mac设备中使用单用户模式来重设用户的管理员帐户密码的教程,如果你也有这方面需求的话,不妨来参考一下. 单用户模式能重设Mac管理员帐户密码? 该锋友表示,如果Mac设备的当前系统为El Capitan.Yosemite.Mavericks.Mountain Lion或者Lion的话可以通过以下操作步骤来实现: 1. 在单用户模式下启动Mac设备. 2. 打开终端窗口,然后输入以下命令: mount -uw / 3. Capitan或Yosemit