我正在构建一个忘记密码页面。我一直在阅读,许多消息来源建议让用户输入他们的电子邮件地址,然后在DB中添加一个令牌,并向他们发送一个链接,其中包含作为GET变量附加的令牌。
我很好奇为什么这个令牌真的有必要?如果令牌已过期,任何有不良意图和访问你的电子邮件的人都可以直接回到忘记的密码页面并再次输入你的电子邮件以获得新的密码重置链接
如果某人有权访问您的电子邮件地址,我甚至没有注意到某个令牌会在某个时刻到期。为什么我要在“忘记密码”页面上使用过期令牌?
答案 0 :(得分:0)
我们假设有恶意的人想要访问example.org上的帐户,但 无法访问您的电子邮件帐户。还假设example.org的“忘记密码”算法的令牌不会过期。
如果他至少有一半聪明的话,这个人会在example.org上做他的研究并设置一个假帐户并点击“忘记我的密码”按钮并自己获得一个重置链接以了解这些令牌是如何构建的(至少,他们所处的格式)。
然后,所述人键入您的用户名并点击“忘记了我的密码”按钮,该按钮通过电子邮件发送您一个未过期的重置链接,但他们不会关心这一点 - 他们知道重置令牌所处的格式;因此,他们可以通过增加令牌来强制重置页面,直到找到有效的命中。
当然,这种方法在技术上会找到所有尚未完成的重置请求,但也会找到你的。
如果令牌过期,并且在合理的时间限制内,生成所述令牌及其到期之间的时间量将在攻击者可以“猜测”它之前发生。当然,你总是有机会在他们猜测之前看到电子邮件 - 但这远远不如添加到期时间那么安全= P
答案 1 :(得分:0)
你可以反过来问这个问题:为什么重置链接永远有效?
当我要求密码重置链接时,我会在大约一两个小时内正常使用它。没有优势,当我可以在两年后点击链接时,可能我不会记得这样的重置链接甚至存在。并且很容易申请新的链接。
另一方面,如果将来有人访问我的电子邮件帐户,或者以某种方式获得我的电子邮件备份,那么他可以使用重置链接。能够阅读电子邮件并不一定意味着,可以登录电子邮件帐户。例如,办公室里有一个开放的电子邮件客户端,一个忘记了的网吧退出,一个丢失的手机......
令牌本身应确保攻击者无法预测新重置链接的代码。最好使用随机代码,而不是由用户名,当前时间或电子邮件地址等参数生成的代码。
通常人们可以说,为什么使用较弱的方案,如果有更强的方案,那么编码的工作不是很难?