怎样设计密码重设功能
October/1st 2013

当我们设计一个带有用户注册/登录功能的网站的时候,一个必须的功能就是重设密码。 重设密码功能有很多种设计方式,比如发送一个新密码到用户邮箱等。不过今天我要介绍一个我经常用实现方式。

用户流程:

  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是绝对安全的

更详细的样例代码可以参考这里:http://jszen.com/reset-password-system.6.html



4648 read 5 comment(s)
#1
piggy   去年10月04日 23:56       回复
这是针对有邮箱的方法~~
#2
kevin   去年10月23日 14:16       回复
博主,您哈,你的博客不错,有技术还有赚钱法。呵呵。我想请教一下,你的php.js.cn的服务器貌似在日本,是在哪一家主机商买的吖?速度很快啊。
#3
longbill   去年10月23日 15:12       回复
@kevin Linode日本机房。 你要注册的话,用这个链接,我可以免费用一个月的VPS,你不知道有没有好处   https://www.linode.com/?r=cf2e4dac9dc7231b15ec90cf0a23dda3ffa22c57
#4
kevin   去年10月23日 23:17       回复
谢谢博主,我去看看
#5
satomic   07月05日 01:00       回复
longbill您好~我在网上下载了您endtalk的随机聊天的源码,但是我配置不好数据库。能请教您一下么?在下的QQ:1093185216,不胜感激~
添加新的评论
称呼:*
邮件:*
网站:
内容:

Copyright © Longbill 2008-2014 , Designed by EndTo , Powered by EndCMS