我们有一个注重安全的客户,在他们的“忘记密码”流程中,会发送一封电子邮件,其中包含重置密码的链接。现在,该链接永不过期,从而引发了潜在的安全问题。
我们的开发人员听起来确信,唯一安全的方法是向数据库添加一个字段并使用它,但这意味着将一个全新的数据库推送给我们的客户......并不理想。
这样做有哪些选择,是否有更轻量级和更少侵入性的选择?
谢谢!
当您创建重置令牌并将其发送给您的用户时,您可以创建一个带有签名的安全客户端到期日期并将其附加到 URL:
/reset/?token=foo&expires=date.signature
或者将其全部作为令牌的一部分:
/reset/token.date.signature
签名是密钥和 的函数date
。date
将通过其签名进行验证,从而防止其被篡改。您甚至不需要将日期存储在数据库中,因为它可以从 URL 中提取出来。
我不确定您使用的是什么环境,但有一个 Python 库可以执行此操作:http: //pythonhosted.org/itsdangerous/。
如果存在用于创建记录的时间戳字段,则可以将其用作重置标准的一部分。IE
// Pseudo code
if (($link_exists && $time - 3600 > strtotime($link_timestamp)){
// allow reset password.
}
向数据库添加字段可能是您的最佳选择,您的开发人员就在那里。
一种替代方法是在链接中包含日期并为其添加签名。虽然很难做到这一点,而且它会使你的 URL 很长:
单独的链接代码至少需要 44 个字符,再加上 url 的其余部分,这可能会变成一个很长的链接。一些电子邮件客户端会遇到长链接问题。
我建议保留这 18 个字符并添加一个数据库字段。谁知道,下一步应该添加什么信息,也许是最大点击次数?数据库是可扩展的,链接不是。