【问题标题】:Has a account validation or password reset token really to be unique?帐户验证或密码重置令牌真的是独一无二的吗?
【发布时间】:2017-05-10 02:39:24
【问题描述】:

我必须创建一个电子邮件验证和密码重置系统,因此我需要一个令牌生成器。起初我认为这些令牌必须是严格唯一的,但是当我检查数据库中的 hash(token) 和电子邮件时,我不明白为什么我不应该只使用足够长度的随机字符串而不附加 uniqid()示例(这也很明显)。

我对这个假设是否正确?

【问题讨论】:

  • 是的,它们必须是唯一的并且只使用一次。如果同一个用户尝试使用同一个密钥并且不被允许/不应该被允许,那么这可能是一个问题。
  • 另外,如果您使用 db 中的 AI/PK 密钥(您应该这样做),那么将唯一密钥与 AI/PK 一起使用,将使其更加独特“用户”。顺便说一句,我回到这个问题,看看是否还有活动;还有一条评论,但被删除了。我唯一看到的更多是我赞成的评论。我认为这几乎(应该)回答了这个问题。如果你愿意,你可以 ping 我,因为我现在已经永远离开了这个问题。享受你的圣诞节,干杯

标签: php passwords token reset


【解决方案1】:

并非如此,它只需要对该用户是唯一的。

例如,作为密码重置的一部分,您可以要求提供用户名或电子邮件地址。在这方面,您的重置令牌只需要对该用户是唯一的。

此外,由于您不必在所有用户的已知良好令牌列表中查找令牌,因此速度要快得多。

例如,对于全球唯一的密码重置令牌,我要么必须使用一些额外的详细信息(例如用户信息)来区分该令牌与其他令牌,要么必须以某种方式搜索所有已知令牌。

使用唯一的用户/哈希代码,我只需验证为该用户提供的代码是否有效。相比之下,您通常会发现数组搜索甚至哈希表查找都需要更多时间。

例如,如果用户没有启动密码重置,那么与他们之前相比,他们的内部用户可能看起来像这样。请注意,在此示例中,我们只允许一个最近的密码重置请求(而不是多个):

User.getName() = "Bob"
User.getUserName() = "Bob5412"

User.resetPasswordRequestedTime() = null
User.resetPasswordToken() = null
or
User.resetPasswordRequestedTime() = 1482628217
User.resetPasswordToken() = "f7de43859d244439b101df4e02cc4e17"

现在我只需要检查令牌是否对请求的用户有效。再也不用担心“全球唯一”了。

在我的代码中,我可能要求用户在 4 小时内完成任何密码重置请求,因此如果他们在此之后收到请求,我会忽略他们的请求而不进行任何检查。

【讨论】:

  • 是的,这正是我的想法。令牌过期功能肯定是我会实现的,因为它是减少可用的易受攻击令牌池的好方法。
猜你喜欢
  • 2021-01-05
  • 2011-08-18
  • 2012-10-08
  • 1970-01-01
  • 2023-01-22
  • 2021-08-28
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多