-1

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

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

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

谢谢!

4

3 回答 3

3

当您创建重置令牌并将其发送给您的用户时,您可以创建一个带有签名的安全客户端到期日期并将其附加到 URL:

/reset/?token=foo&expires=date.signature

或者将其全部作为令牌的一部分:

/reset/token.date.signature

签名是密钥和 的函数datedate将通过其签名进行验证,从而防止其被篡改。您甚至不需要将日期存储在数据库中,因为它可以从 URL 中提取出来。

我不确定您使用的是什么环境,但有一个 Python 库可以执行此操作:http: //pythonhosted.org/itsdangerous/

于 2013-05-24T18:41:02.483 回答
1

如果存在用于创建记录的时间戳字段,则可以将其用作重置标准的一部分。IE

// Pseudo code
if (($link_exists && $time - 3600 > strtotime($link_timestamp)){
    // allow reset password.
}
于 2013-05-24T18:42:20.023 回答
0

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

一种替代方法是在链接中包含日期并为其添加签名。虽然很难做到这一点,而且它会使你的 URL 很长:

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

单独的链接代码至少需要 44 个字符,再加上 url 的其余部分,这可能会变成一个很长的链接。一些电子邮件客户端会遇到长链接问题。

我建议保留这 18 个字符并添加一个数据库字段。谁知道,下一步应该添加什么信息,也许是最大点击次数?数据库是可扩展的,链接不是。

于 2013-05-25T22:14:46.330 回答