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