【问题标题】:Links that expire过期的链接
【发布时间】:2014-06-28 02:40:59
【问题描述】:

所以基本上我正在重置密码并想设置时间限制。这是我的代码

$time = time();
$hash = md5($id . $time . "somerandomsalt"); // check this again in activation.php
$link = "activation.php?id=" . $id . "&hash=" . $hash . "&time=" . $time;

这会安全吗?我想做的就是让链接在 1 小时后过期。我也有这个生成令牌的代码(我认为这个代码更安全)。

$rand = openssl_random_pseudo_bytes(16); // take 8 random bytes
$token = substr(sha1($rand), 0, 49);

问题是我不知道该怎么说

http://localhost:8888/forgot/activate.php?token=467e65833fc977767d5b000929d1229fa5eaf309

一定时间后过期。有任何想法吗?

【问题讨论】:

  • 您可以在控制器中查看日期时间
  • 好吧,一旦我将日期存储在数据库中。我怎样才能知道它的年龄? @ManoloSalsas
  • 在你的数据库中记录时间戳...
  • 好吧,我基本上是在问如何将时间戳与当前时间进行比较@Fabricator
  • 假设日期时间已存储。如果 new Datetime()

标签: php html mysql database pdo


【解决方案1】:

我认为最安全的方法是将哈希的生成时间存储在数据库中。所以你会有两列:tokentoken_created_at(名称无关紧要)。当用户单击该链接时,您查询数据库中的token 并将token_created_at 与当前时间进行比较。如果差值超过一个小时,则引发错误。

编辑:要找出差异,请从token_created_at 创建一个DateTime 对象,并在其上添加1 小时以获取到期时间。然后将其与当前时间进行比较。如果当前时间小于过期时间,则表示令牌有效,否则表示已过期。代码如下所示:

$token_created_at = new DateTime('2014-06-28 03:14:07');
$expires_at = $token_created_at->modify('+1 hour');

$current_time = new DateTime();

if ($current_time < $expires_at) {
  // Token is valid.
} else {
  // Token has expired.
}

【讨论】:

  • 非常感谢您的回答。我的问题基本上是如何找到差异?我将如何获得时间? $date = date('m/d/Y h:i:s a', time());?
  • date('Y-m-d H:i:s') 为您提供相当于 MySQL 日期时间或时间戳类型的功能。您可以使用 SQL 查询进行比较,或将 token_created_at 提取到 PHP 变量中,在其上运行 strtotime(),然后将其与 time() 进行比较。
  • 所以我会做一个 if else 语句。正确的?我会检查什么。我会从数据库中的时间减去当前时间吗? @jsickles
  • 实际上在表中包含三列是个好主意; id、hash 和创建时间。
  • 当我像这样2014-06-28 01:14:07 回滚一两个小时时,我仍然认为它是有效的。到时候不应该过期吗?到期前一个小时,对吧?此外,当我做2014-06-28 05:14:07 时,它仍然有效
猜你喜欢
  • 1970-01-01
  • 2014-05-07
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
相关资源
最近更新 更多