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

Database 我们可以打个“电话”吗;“忘记密码”;链接在XX分钟后过期而不更改我们的数据库?,database,security,passwords,Database,Security,Passwords,我们有一个安全意识强的客户端,在他们的“忘记密码”流程中,会发送一封电子邮件,其中包含重置密码的链接。现在,这个链接永远不会过期,这带来了潜在的安全问题 我们的开发人员似乎确信,唯一安全的方法是向数据库添加一个字段并使用它,但这意味着将一个全新的数据库推送到我们的客户机上。。。不理想 做这件事有什么选择,有重量更轻、干扰更小的选择吗 谢谢 当您创建重置令牌并将其发送给用户时,您可以创建一个带有签名的安全客户端过期日期,并将其附加到URL: /reset/?token=foo&expire

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

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

做这件事有什么选择,有重量更轻、干扰更小的选择吗


谢谢

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

/reset/?token=foo&expires=date.signature
或者将其作为代币的一部分:

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


我不确定您使用的是什么环境,但有一个Python库可以做到这一点:。

如果有一个时间戳字段用于创建记录,那么它可以用作重置条件的一部分。i、 e

// Pseudo code
if (($link_exists && $time - 3600 > strtotime($link_timestamp)){
    // allow reset password.
}

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

另一种选择是在链接中包含日期并添加签名。虽然这很难做到安全,而且会使您的URL很长:

  • 日期必须保持可提取,即仅为日期添加约8个字符(必须为url编码)
  • 很难构建安全的签名,如果已知算法,攻击者可以构建自己的有效链接。常见的散列算法会产生长字符串,即使base62编码的MD5也会产生22个字符的字符串。因此,我们必须计算至少10个额外字符的链接
  • 安全令牌应包含不少于20个随机字符
  • 因为令牌应该只在数据库中散列存储,所以我们必须在链接中包含一个id,以便稍后可以找到散列令牌。这个数字可以再增加6个字符
单是链接代码就需要至少44个字符,再加上url的其余部分,这可能会成为一个相当长的链接。某些电子邮件客户端会遇到长链接问题


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

好吧,当每个链接在某个地方过期时,您需要保存。重置令牌现在是如何存储的?如果有用于创建记录的时间戳字段,则可以将其用作重置条件的一部分。您需要以某种方式保留时间戳。如果无法在数据库中执行此操作,请尝试使用从url派生的名称创建一个空临时文件。然后启动一个后台线程来删除超过时间限制的文件。当有人单击某个链接时,请检查该文件是否存在。@Orangepill为什么不将此作为答案发布?依我看,这是最好的方法,但它应该以某种方式编码