原理很简单:
用户找回密码的时候,填写用户名,程序得到用户名便可以去数据库取出用户对应的密码以及当时填写的邮箱,
根据用户名和密码生成一个key=md5(username+password),然后$string=base64_encode(username+key),发送邮件给用户,邮件内容为http://www.xxx.com?p=$string,
用户点击链接地址,程序进行相关操作,先$str=base64_decode($string),之 后$arr=explode('+',$str),$arr[0]肯定为用户名,根据用户名得到用户的密码,再使用 key=md5(username+password),判断$arr[1]与key是否一致,一致的话就输出两个表单,让用户填写新的密码和确认密码。
问题一:
会不会最后一步的输入新的密码的是,用户把username改成别人的,然后再提交新的密码过去?
问题二:
为什么不直接在发送给用户的邮箱里面地址这样写http://www.xxx.com?username=xxx&key=$string ?
答: 原理其实是一致的
扩展:
一:如何让这个找回密码的链接具有时效性(比如15分钟后失效)?
答:原理:在地址栏上面加上一个时间和这个时间的加密,如果用户点击这个链接去处理的当时时间-地址栏的时间大于15分钟,则这个找回密码的链接失效
http://www.xxx.com?username=xxx&key=$string &code=md5("自己定义的常量串".$time)&time=$time
其中code是用来检验time是否有修改过。
二:
将user_id换成别的user_id会不会就修改了别的用户的密码?
答:不会,因为其实在点击链接过去的时候,就已经在session里面存储了user_id,所以在接收input传来的user_id的时候,我们会判断是否和session里面的user_id一致,如果不一致的话,就以session里面的user_Id为准