我们可以在XX分钟后使“忘记密码”链接过期而不更改我们的数据库吗?

时间:2013-05-24 18:31:30

标签: database security passwords

我们有一个注重安全的客户端,在他们的“忘记密码”流程中,会发送一封电子邮件,其中包含重置密码的链接。现在,该链接永不过期,从而引发了潜在的安全问题。

我们的开发人员确信,唯一安全的方法是在数据库中添加一个字段并使用它,但这意味着将一个全新的数据库推送到我们的客户端......并不理想。

这样做有哪些选择?是否有更轻量级和更少侵入性的选项?

谢谢!

3 个答案:

答案 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)

在您的数据库中添加字段可能是您的最佳选择,您的开发人员就在那里。

一种替代方法是在链接中包含日期并为其添加签名。虽然很难保证这个安全,但它会让你的网址很长:

  • 日期必须保持可提取状态,仅为日期添加约8个字符(必须为网址编码)。
  • 构建安全签名很困难,如果算法已知,攻击者可以构建自己的有效链接。常见的哈希算法会产生长字符串,即使是base62编码的MD5也会产生22个字符的字符串。因此,我们必须至少为链接计算10个附加字符。
  • 安全令牌应包含不少于20个随机字符。
  • 因为令牌只应存储在数据库中,所以我们必须在链接中包含一个id,以便稍后我们可以找到哈希令牌。这个号码可以再添加6个字符。

单独的链接代码至少需要44个字符,然后与网址的其余部分一起,这可能会成为一个很长的链接。某些电子邮件客户端会遇到长链接问题。

我建议保留这18个字符并添加数据库字段。谁知道,您接下来要添加哪些信息,可能是最大点击次数?数据库是可扩展的,链接不是。