密码找回方式

现在的论坛、社区等需要注册的地方都有个功能,就是找回密码,现在看看我总结的实现思路。

首先,用户通常用邮箱注册的账号,那么找回密码就是把密码发到它邮箱中去,就有以下几种流程:

第一种办法:
1.用户填写用户名和注册邮箱,回答找回密码问题
(我一直觉得找回密码问题没什么实际作用,加重了用户操作负担)
2.server将用户本来的密码发送到用户邮箱中
3.一般注册密码都是经过MD5加密存储在数据库中,这个加密算法几乎不可逆,那么如果需要发送给用户其原始密码,就需要有个字段记录用户的裸露密码,也就是未经加密的密码

这种办法,比较好实现,只需要将数据库对应字段的密码发送给用户就行了,但是密码加密就失去了本来的作用了,所以不太可用,可以偷懒用用。

第二种办法:
1.用户填写用户名和注册邮箱
2.server发送到用户邮箱一个链接
3.用户通过邮箱中的链接,进入修改密码页面,这个页面只需填写用户的用户名、注册邮箱和新的密码、确认密码即可
4.这个页面的链接是随机生成,通过重定向进入界面,并且链接在若干时长内有效(比如30分钟有效时间),也就是说,在server发送出去了用户的找回密码邮件之后,就开始计时,在30分钟之后,链接自动失效
5.而这个页面,如果没有找回密码邮件的请求,用户是永远无法访问得到的,因此用户也就根本看不到其他用户的这个页面,除非正在修改密码的用户,通过胡乱在浏览器的地址栏上写了一个地址,竟然访问到其他正在修改密码用户的这个页面,那这个用户中大奖的概率太高了,赶紧去买彩票吧……

这种办法在实现上来说,是较为复杂的,但是对于用户使用来说,是能让用户自我控制的方法。

第三种办法:
1.用户填写用户名、注册邮箱
2.server发送给用户一个随机的新密码,这个密码是server在接收到找回密码请求后生成,并且写入用户数据库中的
3.用户可以用这个密码登陆,修改自己的密码,也可以不改,直接用这个密码了。

总结,在以上三种办法中
第一种几乎没有使用的价值,是偷懒的办法
第二种感觉上有些不靠谱,但是从用户角度来说,可以自己控制自己的密码,体验相对友好
第三种整个流程来说是比较严密的,但是随机生成的密码对于用户来说增加了修改密码的操作负担,不过是目前找回密码中用的比较多的一种办法。


=================================================================================================================================

如果点击 找回密码,就让你填写你的邮箱直接把一个随机密码发你邮箱不行吧,如果谁都这么搞那有人捣乱乱把别人的账户填进去人家就登录不了了。

一般网站好像是点 找回密码后,给你邮箱发一个链接,你点击链接才可以修改你的密码。

问题1:
这个方法机制上是怎么实现的,url的构造,需要那些东西来实现修改某个特定用户的密码又很安全不被别人利用?
一般这种url有个过期时间,例如,三天内有效,或者发了几个给你,url都不一样,点了一个后,再点其他的也提示无效,这些是如何实现的?

感觉很高深的样子

共 25 个关于本帖的回复 最后回复于 2012-7-31 00:02

2#
dongzide  百象  发表于 2012-7-27 16:33:04  |  只看该作者
 
 
   
3#
齐迹  百象  发表于 2012-7-27 16:50:55  |  只看该作者
可以这样
每次找回密码生成一条记录
包括 几个主要的数据 用户名 邮箱 随机码 时间戳  有效状态
参数1个是用户名或者邮箱还有你的key 可以通过 md5(用户名.随机码.时间戳)作为url参数

如果用户多次找回密码 可以更新这个表的时间和随机码
找回成功把记录更新为无效或者删除
 
 
   
4#
爱℅Ж的ξ  十象  发表于 2012-7-27 16:54:46  |  只看该作者
URL应该是随机生成的,那个URL应该是从数据库调用出来的判断一下!~
 
 
   
5#
大尾巴  百象  发表于 2012-7-27 17:06:22  |  只看该作者
新建一个  “密码找回”表
记录3个字段
“user_id”  “过期时间”  和一个“随机md5值”


用户点忘记密码的时候
#1() { 删除忘记密码表中  user_id = $user_id的 记录 }
并生成一个随机md5值     插入一条新记录

然后把md5值加到url里    发送给用户


用户点击url的时候
(检测  “密码找回表”    该md5值是否存在 && 是否过期)
不存在 || 过期 
      执行 #1() exit 
else 
      则取出 user_id    并允许用户修改密码 

修改完成   执行#1()
1

查看全部评分

 
 
   
6#
qxhy123  管理员  发表于 2012-7-27 17:07:43  |  只看该作者
5楼正解,一般都是这么个流程
 
 
   
7#
冯.于安  名誉版主  发表于 2012-7-27 17:11:13  |  只看该作者
本帖最后由 冯.于安 于 2012-7-27 17:12 编辑
大尾巴 发表于 2012-7-27 17:06 
新建一个  “密码找回”表
记录3个字段
“user_id”  “过期时间”  和一个“随机md5值”

你这是在挑战产品经理的智商.

还需要用个新表? qxhy123也是一样, 难道现在的人都不思考了?
2

查看全部评分

 
 
   
8#
dongzide  百象  发表于 2012-7-27 17:16:33  |  只看该作者
冯.于安 发表于 2012-7-27 17:11 
你这是在挑战产品经理的智商.

还需要用个新表? qxhy123也是一样, 难道现在的人都不思考了?  ...

哦,你有更好的办法???
 
 
   
9#
qxhy123  管理员  发表于 2012-7-27 17:16:52  |  只看该作者
冯.于安 发表于 2012-7-27 17:11 
你这是在挑战产品经理的智商.

还需要用个新表? qxhy123也是一样, 难道现在的人都不思考了?  ...

你要是想省点儿数据库硬盘资源我也不拦着你
 
 
   
10#
dongzide  百象  发表于 2012-7-27 17:17:26  |  只看该作者
大尾巴 发表于 2012-7-27 17:06 
新建一个  “密码找回”表
记录3个字段
“user_id”  “过期时间”  和一个“随机md5值”

三克油
 
 
   
11#
冯.于安  名誉版主  发表于 2012-7-27 17:23:20  |  只看该作者
qxhy123 发表于 2012-7-27 17:16 
你要是想省点儿数据库硬盘资源我也不拦着你

就算不省硬盘, 也不是这样创表, 况且按需求而论, 目前好像还没有哪家程序需要知道用户什么时候使用过找回密码, 即这步骤的日志都省略了. 那我们要怎么实现用户更改密码呢?

我们看需求:
   用户忘记密码了, 需要修改.
   仅可以给由邮件链接过来的用户进行修改.
   可能仅可使用一次.
   安全性问题.

那我们开始工作.
   创建个修改的url, index.php?update=pass&encode=这是加密内容
  千万不要问我, 为什么要用加密内容.
   加密内容为 email=xxxxxx&pass=用户名所对应的目前密码md5值&time=时间&用户id=xxx
   当用户点击链接后, php作解密判断, 判断流程自己定, 反正值都传给你了, 完全看你的逻辑.
1

查看全部评分

 
 
   
12#
大尾巴  百象  发表于 2012-7-27 17:39:13  |  只看该作者
冯.于安 发表于 2012-7-27 17:23 
就算不省硬盘, 也不是这样创表, 况且按需求而论, 目前好像还没有哪家程序需要知道用户什么时候使用过找回 ...

除了节约数据库资源
没发现有什么特别高明之处啊


仅可以给由邮件链接过来的用户进行修改.

请问如何判断是从邮件点过来的
可能仅可使用一次.

如何设定仅使用一次?
(存数据库的就轻松做到了 , 只要再访问url的时候删除就好了)
 
 
   
13#
冯.于安  名誉版主  发表于 2012-7-27 17:49:16  |  只看该作者
大尾巴 发表于 2012-7-27 17:39 
除了节约数据库资源
没发现有什么特别高明之处啊

你又在考验我的智商.

index.php?update=pass&encode=xxxxx
除了你自己可以解encode的值, 用户还可以手工修改?? 你先搞明白什么叫加密内容.
使用一次, 查询uid的pass密码md5值, 跟encode加密串中的原始md5作对比, 如果一样, 表示没修改, 如果已经变更, 表示已经修改了.
 
 
   
14#
大尾巴  百象  发表于 2012-7-27 18:00:49  |  只看该作者
本帖最后由 大尾巴 于 2012-7-27 18:13 编辑
冯.于安 发表于 2012-7-27 17:49 
你又在考验我的智商.

index.php?update=pass&encode=xxxxx

可能是你的说法我理解错

我以为你能达到的效果是
1 我收到邮件 只有从我自己邮件点过去有效
我复制给你你再点就无效了

2 只有第一次访问的时候可以有效, 访问第二次就无效了


而我这边的需求恰恰  需要的就是 
只有第一次访问链接时有效 
修改密码时需要短信验证, 验证后才可以修改密码
于是验证后会发一个链接 , 这个链接只允许访问一次
即使没有修改密码 , 无论再次刷新或是发给别人, 
只要是第二次点开都必须是无效的


再挑战一下于老板智商 
 
 
   
15#
qxhy123  管理员  发表于 2012-7-27 18:08:11  |  只看该作者
我会告诉你存了用户申请找回密码是为了防止用户邮箱密码泄露造成用户密码被篡改造成用户在网站遭受金钱或其他方面的损失起诉网站没有妥善保管用户资料的时候可以反诉用户自己没有妥善保管邮箱密码么,如果你的网站只是小网站,那你随意,商业性的网站必须要考虑这些因素,涉及用户敏感资料修改的操作都需要有日志
 
 
   
16#
冯.于安  名誉版主  发表于 2012-7-27 18:26:54  |  只看该作者
qxhy123 发表于 2012-7-27 18:08 
我会告诉你存了用户申请找回密码是为了防止用户邮箱密码泄露造成用户密码被篡改造成用户在网站遭受金钱或其 ...

楼主说的是一般网站. 就csdn也不会有日志, discuz更不用说. phpchina完全可以省略.
 
 
   
17#
dongzide  百象  发表于 2012-7-27 19:04:48  |  只看该作者
冯.于安 发表于 2012-7-27 17:23 
就算不省硬盘, 也不是这样创表, 况且按需求而论, 目前好像还没有哪家程序需要知道用户什么时候使用过找回 ...

貌似这个可以啊,功能都达到了,而且更简单。

就是写的不详细我的在琢磨琢磨具体流程
 
 
   
18#
sudutao    发表于 2012-7-27 21:10:26  |  只看该作者
随机的吧。。。楼上正解
 
 
   
19#
剑枫  千象  发表于 2012-7-30 09:27:31  |  只看该作者
1、用户点击找回密码,判断用户是否存在,取得用户邮箱

2、针对此用户插入一条记录,存入用户名和邮件发送时间

3、创建url,后挂参数 token=加密(用户名+发送时间),并发送连接到用户邮箱

4、用户从邮箱点回,解密token,判断发送时间是否超过24小时,判断用户名是否正确,如果都通过则删除对应记录,并进入修改界面

5、这样用户24小时内只许找回一次,避免恶意骚扰。并可以定期清理记录表
 
 
   
20#
七月十五  千象  发表于 2012-7-30 10:22:04  |  只看该作者
找回密码可以在帐号表上做对应的算法,无需新表,但是,通过邮箱找回密码的帐号表必须有“邮箱”字段。

提交找回密码邮箱,系统发送找回密码URL(一般通过算法encode含有效期、邮箱、帐号等信息的)到指定邮箱,点击此URL,进入找回密码脚本(decode那串URL来判断是否失效),直接让用户输入新密码(有些还让输入邮箱,或者做来源判断),搞定。

各种算法都不尽相同,用找回密码表也能实现,总体流程都差不多。
 
 
   
21#
齐迹  百象  发表于 2012-7-30 11:03:31  |  只看该作者
不要做无谓的争辩!
用数据库和url加密方式各有各的好
按需使用把!
 
 
   
22#
skiden  百象  发表于 2012-7-30 11:17:46  |  只看该作者
君不见很多系统都限制了用户在单位时间内找回密码的次数?
 
 
   
23#
剑枫  千象  发表于 2012-7-30 17:40:43  |  只看该作者
skiden 发表于 2012-7-30 11:17 
君不见很多系统都限制了用户在单位时间内找回密码的次数?

是啊,避免恶意骚扰
 
 
   
24#
feng19910104  十象  发表于 2012-7-30 21:49:34  |  只看该作者
剑枫 发表于 2012-7-30 09:27 
1、用户点击找回密码,判断用户是否存在,取得用户邮箱

2、针对此用户插入一条记录,存入用户名和邮件发送 ...

3、创建url,后挂参数 token=加密(用户名+发送时间),并发送连接到用户邮箱


这这也太危险了吧

还是随机吧!
 
 
   
25#
大尾巴  百象  发表于 2012-7-30 23:56:59  |  只看该作者
数据库建表是  教科书式的方法
变通性强

你们非要另创一套方法
需求稍微改改就得重新设计

比如我的那个短信确认改密码的需求  
包括楼上所说的 单位时间限制次数
大家可以看看不用数据库怎么实现
 
 
   
26#
starsea  版主  发表于 2012-7-31 00:02:11  |  只看该作者
最近各大网站频繁爆 忘记密码 漏洞 乃们知道么


记密码功能的安全实现(邮件方式)

最近在做P2P网贷系统,由于对安全的要求比较高,因此做每一步都比较小心,考虑再三。

在做忘记密码功能时考虑到邮箱链接的安全性,去网上参考下别人的意见,查询后发现许多网站的这个功能都存在漏洞,如:

手机方式:http://www.wooyun.org/bugs/wooyun-2010-018055    

邮件方式:http://www.2cto.com/Article/201305/215934.html

     http://www.wooyun.org/bugs/wooyun-2013-017322

吓到了吧,所以任何小的功能稍加不注意,可能就是一个大的漏洞

我的解决方案:(有不同意见的可以马上喷):

1.存储数据库是必须的,先建数据库表用来存储每次发送的信息,表结构如下

编号:就是与某个用户进行关联,标注是哪个用户点击了忘记密码(在发送邮件前肯定有叫用户输入信息如用户名,邮箱地址),这样我们就能锁定该用户了

过期时间:就是设定邮件在多少时间内有效

随机md5值:是用来唯一标注邮件链接的,可以生成时间戳然后用md5进行加密

类型:用来区分不同的链接,看你自己的需要

2.用户点击忘记密码后,我们需要他们输入用户名,邮箱地址来进行用户的认证,如果认证正确则向该用户发送一封重置密码的链接邮件,并将信息存入到该表中:

如下:

3.用户点击后重置密码后,程序进行验证,通过vcode和email到记录表中进行查询,如果存在表示该链接有效,

如果验证正确了就显示重置密码页面,重置成功后将那个记录进行删除(也可以添加一个字段来标注用户点击链接的次数,控制超过几次后就将过期)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值