Php 帐户验证或密码重置令牌是否确实是唯一的?

Php 帐户验证或密码重置令牌是否确实是唯一的?,php,passwords,token,reset,Php,Passwords,Token,Reset,我必须创建一个电子邮件验证和密码重置系统,因此我需要一个令牌生成器。起初我认为这些令牌必须是严格唯一的,但当我检查数据库中的哈希(令牌)和电子邮件时,我不明白为什么我不应该只使用长度足够的随机字符串,而不附加uniqid()(这也很明显) 我的假设正确吗?不正确,它只需要对该用户是唯一的 例如,作为密码重置的一部分,您可以要求提供用户名或电子邮件地址。在这方面,您的重置令牌只需要对该用户是唯一的 此外,由于您不必在所有用户的已知良好令牌列表中查找令牌,因此速度要快得多 例如,对于全局唯一的密码重

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


我的假设正确吗?

不正确,它只需要对该用户是唯一的

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

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

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

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

例如,如果用户没有启动密码重置,则与启动密码重置时相比,他们的内部用户可能是这样的。注意:在本例中,我们只允许一个最近的密码重置请求(不是多个):

现在,我只需要检查令牌对于请求的用户是否有效。不再需要担心“全球独一无二”


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

是的,它们必须是唯一的,并且只使用一次。如果同一个用户尝试使用同一个密钥,但不被允许/不应该被允许,那么这可能是一个问题。此外,如果您使用的是db的AI/PK密钥(您应该这样做),那么在AI/PK中使用唯一密钥将使其“对用户”更为独特。顺便说一句,我回到问题上来,看看是否还有活动;有另一条评论,但已被删除。我看到的唯一更多的是我投赞成票的评论。我认为这一点和这一点几乎可以回答这个问题。如果你愿意的话,你可以打我,因为我现在已经把这个问题永远留在这里了。祝你圣诞快乐,干杯,这正是我的想法。令牌过期功能肯定是我要实现的,因为它是减少可用的易受攻击令牌池的一个很好的方法。
User.getName() = "Bob"
User.getUserName() = "Bob5412"

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