在php中创建有时间限制的页面

在php中创建有时间限制的页面,php,Php,我正在尝试在我的网站中实现一个忘记密码的页面。我只是想知道我的想法是否正确。用户输入他的电子邮件地址,我将他的IP、时间戳和“随机密码更改”页面的id保存在数据库中。我用fopen()创建了这个“随机密码更改”页面;。一旦用户点击电子邮件链接,我会检查页面是否应该过期(例如30分钟)。如果页面过期,我会将页面重定向到“抱歉太晚”页面,在该页面中,我使用unlink()删除“随机密码更改页面”,如果未过期,我会让用户更改其密码,将其重定向到“密码更改”页面,并从那里删除密码更改带有取消链接()的“

我正在尝试在我的网站中实现一个忘记密码的页面。我只是想知道我的想法是否正确。用户输入他的电子邮件地址,我将他的IP、时间戳和“随机密码更改”页面的id保存在数据库中。我用fopen()创建了这个“随机密码更改”页面;。一旦用户点击电子邮件链接,我会检查页面是否应该过期(例如30分钟)。如果页面过期,我会将页面重定向到“抱歉太晚”页面,在该页面中,我使用unlink()删除“随机密码更改页面”,如果未过期,我会让用户更改其密码,将其重定向到“密码更改”页面,并从那里删除密码更改带有取消链接()的“随机密码更改”页面。 这样做的副作用…如果用户不点击电子邮件链接,我的随机页面将永远不会被删除

你觉得这个怎么样?这是个好习惯吗

更新
大家好!感谢大家的帮助!现在一切似乎都很顺利:)

每次确认都不需要专用文件。确认代码可以作为URL中的查询参数传递:

http://example.com/verifyme.php?confirmation=XXXXX
脚本将通过

$code = $_GET['confirmation'];

然后在数据库中进行确认/停用业务。verifyme页面将始终存在,但除非传入代码,否则不会执行任何操作。

每次确认都不需要专用文件。确认代码可以作为URL中的查询参数传递:

http://example.com/verifyme.php?confirmation=XXXXX
脚本将通过

$code = $_GET['confirmation'];

然后在数据库中进行确认/停用业务。verifyme页面将始终存在,但除非传入代码,否则不会执行任何操作。

我认为更好的方法是生成与用户电子邮件和创建时间戳关联的随机哈希

然后向用户发送url,如:

http://example.com/activate.php?email=my@email.com&token=fdeW3tx
然后检查此文件是否存在电子邮件和令牌,以及当前时间是否小于创建时间+30分钟


如果是这样,请通过激活。

我认为更好的方法是生成与用户的电子邮件和创建时间戳相关联的随机散列

然后向用户发送url,如:

http://example.com/activate.php?email=my@email.com&token=fdeW3tx
然后检查此文件是否存在电子邮件和令牌,以及当前时间是否小于创建时间+30分钟

如果是,请通过激活。

更好的方法:

创建onephp页面
forgotPassword.php

如果用户放弃了密码,请保存以下信息:

  • activationid、用户ID、随机激活代码、时间戳
现在发送一个链接
forgotPassword.php?activationid=1234&random activationcode=56789

如果用户单击链接,打开页面并显示一个表单,用户可以在其中重置其密码。如果页面过期(与时间戳比较),则显示“页面不可用”消息

最好的, 基督教

更好的方法:

创建onephp页面
forgotPassword.php

如果用户放弃了密码,请保存以下信息:

  • activationid、用户ID、随机激活代码、时间戳
现在发送一个链接
forgotPassword.php?activationid=1234&random activationcode=56789

如果用户单击链接,打开页面并显示一个表单,用户可以在其中重置其密码。如果页面过期(与时间戳比较),则显示“页面不可用”消息

最好的,
Christian

请不要将文件保存到服务器上!

您应该在密码请求表中存储用户id、时间戳和令牌。另外,您可以向用户发送一封带有链接的邮件,其中包含令牌作为get参数

(例如
www.domain.com/forgottenpassword.php?token=CK32A8

此请求页面应提供输入新密码的表单。从该页面获取请求时,服务器将使用数据库信息检查令牌(必须相同)和时间(实际<保存+延迟)

令牌生成


不要使用用户名和时间戳的散列。这样,外星人可以自己创建一个令牌。当然,这不太可能,它总是。:-)因此,如果需要,请使用随机字符串并对其进行散列,或者将随机字符串与用户信息相结合。

请不要将文件保存到服务器!

您应该在密码请求表中存储用户id、时间戳和令牌。另外,您可以向用户发送一封带有链接的邮件,其中包含令牌作为get参数

(例如
www.domain.com/forgottenpassword.php?token=CK32A8

此请求页面应提供输入新密码的表单。从该页面获取请求时,服务器将使用数据库信息检查令牌(必须相同)和时间(实际<保存+延迟)

令牌生成


不要使用用户名和时间戳的散列。通过这种方式,外国人可以自己创建令牌。当然,这不太可能,它总是。:-)因此,如果需要,使用随机字符串并对其进行散列,或者将随机字符串与用户信息相结合。

不,在文件系统中实际创建页面不是一个好主意。您有数据库来存储令牌他收集信息

您将电子邮件地址(或用户的任何其他标识符–我不建议使用IP)、时间戳和密钥(您称之为id)保存到数据库中。然后向用户发送一封电子邮件,其中包含类似
changepass.php?email=&key=
的链接


当用户打开此URL时,您将获得电子邮件地址和密钥作为参数,并可以检查您的数据库,电子邮件和密钥是否匹配,以及时间戳是否太旧。如果可以,则允许用户更改其pw。如果不可以,则显示错误消息。

不,在文件中实际创建页面不是一个好主意你有你的数据库来存储信息

保存电子邮件地址(或用户的任何其他标识符)