我正在尝试在我的网站中实现密码忘记页面。我只是想知道我的想法是否正确。用户输入他的电子邮件地址,我在数据库中保存他的IP,时间戳和“随机密码更改”页面的ID。我用fopen();创建了这个“随机密码更改”页面。一旦用户点击电子邮件链接,我检查页面是否应该过期(ex 30min)如果它已过期我将用户重定向到“抱歉太晚”页面,我将删除带有unlink()的“随机密码更改页面”,如果是未过期我让用户更改密码,将其重定向到“密码已更改”页面,然后从那里删除“随机密码更改”页面,使用unlink()。 这样的副作用......如果用户没有点击电子邮件链接,我的随机页面将永远不会被删除。
你怎么看待这个?这是一个好习惯吗?
答案 0 :(得分:3)
每次确认都不需要专门的文件。确认代码可以作为URL中的查询参数传递:
http://example.com/verifyme.php?confirmation=XXXXX
脚本将通过
检索它$code = $_GET['confirmation'];
然后确认/停用业务在数据库中进行。验证页面将始终存在,但除非传入代码,否则不会执行任何操作。
答案 1 :(得分:0)
我认为更好的方法是生成与用户电子邮件和创建时间戳相关联的随机哈希。
然后向用户发送以下网址:
http://example.com/activate.php?email=my@email.com&token=fdeW3tx
然后检查此文件是否存在电子邮件和令牌,以及当前时间是否小于创建时间+ 30分钟。
如果是,请通过激活。
答案 2 :(得分:0)
更好的方法:
创建一个 php页面forgotPassword.php
。
如果用户忘记密码,请保存以下信息:
现在发送链接forgotPassword.php?activationid=1234&random-activationcode=56789
如果用户点击该链接,请打开该页面并显示用户可以重置其密码的表单。如果页面已过期(与时间戳进行比较),则会显示“页面不可用”消息。
最佳, 基督教
答案 3 :(得分:0)
请不要将文件保存到服务器中!
您应该在密码请求表中存储用户的ID,时间戳和令牌。另外,您向用户发送一封邮件,其中包含令牌作为获取参数的链接
(例如www.domain.com/forgottenpassword.php?token=CK32A8
)。
此请求页面应提供输入新密码的表单。从这个页面获取请求服务器使用数据库信息检查令牌(必须是我一样)和时间(实际<保存+延迟)。
令牌生成
不要使用用户名和时间戳的哈希值。通过这种方式,外星人可以自己创建一个令牌。当然不太可能,它总是如此。 :-)因此,如果需要,可以使用随机字符串并将其哈希或将随机字符串与用户信息组合。
答案 4 :(得分:0)
不,在文件系统中实际创建页面并不是一个好主意。您有数据库来存储信息。
您将电子邮件地址(或用户的任何其他标识符 - 我不建议使用IP),时间戳和秘密键(您将其称为id)保存到数据库。然后,您向用户发送包含changepass.php?email=<address>&key=<key>
等链接的电子邮件。
当用户打开此URL时,您将获取电子邮件地址和密钥作为参数,并可以检查您的数据库,电子邮件和密钥是否匹配以及时间戳是否过长。如果可以,您允许用户更改他的pw。如果不正常,则显示错误消息。