x小时后过期unix或time()代码

时间:2011-06-02 14:29:11

标签: php

我正在尝试创建一个忘记密码功能,该功能将使x小时后创建的链接失效。因此,当用户请求重置密码时,我将time()数据存储在数据库值中。那我怎么能过期呢?

4 个答案:

答案 0 :(得分:1)

三个选项:

  • 将数据库中保存的时间与用户点击链接时获得的时间进行比较
  • 使用 cron 作业并定期运行
  • 只是不要保存在数据库中并使链接关注所有内容。您可以使用签名+盐来避免用户修改此链接

像:

$now = time();

$sk = sh1($user_id . $now . "yoursupersalthere")

$link = "http://www.example.com/forgot.php?id={$user_id}&ts={$now}&sk={$sk}"

这将是您发送给用户的链接。然后进行检查

$ts = $_GET['ts'];
$user = $_GET['id'];
$sk = $_GET['sk'];

if (!$sk == sh1($user_id . $now . "yoursupersalthere")) {
    die("bad signature");
}
elseif (time() - $ts > 3600 /* or put your expiration limit */) {
    die('link expired');
}

// do your job

答案 1 :(得分:0)

你可能有一个带有重置链接的表条目,只需添加一个日期字段,然后包含一个WHERE expiredate<NOW()或者用一个简单的DELETE from table WHERE expiredata<NOW()不时清理表格

答案 2 :(得分:0)

执行此操作的一种方法是在单击链接时检查链接是否过期 - 某些伪代码:

// when the link is clicked pull the information from the database and get the time
// SQL goes here

// this will give you the difference in seconds
$diff = time() - $timestamp_from_db;

// we'll pretend the time expires in 8 hours
$expires_in = 8 * 60 * 60;

// for this example we'll pretend the expiration is 8 hours
if($diff <= $expires_in)
{
  // has not been more then 8 hours
}
else
{
  // has been more then 8 hours
}

答案 3 :(得分:0)

保持表清洁的最佳方法是实现以下目的:

  • 该表至少需要具有UNIQUE索引的帐户ID和accounts表的外键,具有UNIQUE索引和时间戳的哈希。
  • 在创建链接的页面中,不允许根据随机人员可以获取的信息“重置我的密码”。如果您这样做,可以使用重置密码请求填写表格,并为您的用户生成垃圾邮件和安全问题。
  • 在验证链接第一个的页面中,通过比较NOW()和存储的时间戳来删除所有过期的记录,然后只需使用WHERE ='$ hash'进行SELECT(当然,您要清理$哈希值)。给定散列上的UNIQUE索引,这只能返回一行或没有行。

帐户ID上的UNIQUE索引可确保人们无法在到期时间内请求多次重置。