【问题标题】:Best practices for forgot password function via REST API通过 REST API 实现忘记密码功能的最佳实践
【发布时间】:2015-11-04 02:45:19
【问题描述】:

我正在尝试通过发送重置密码的链接(即向注册用户发送带有一次性令牌的电子邮件)来找到忘记密码功能的最佳做法。令牌将存储在数据库中,当用户单击链接时,我们会检查令牌并允许用户设置新密码。

设计忘记密码功能时的最佳实践 -

  • 令牌必须是不可预测的,最好使用 不基于时间戳或值的“真正”随机代码 像用户ID。
  • 与密码一样,令牌在存储之前应该经过哈希处理 数据库。这使得它们对攻击者毫无用处,即使 数据库被盗。
  • reset-link 最好是短的以避免出现问题 电子邮件客户端,并且仅包含安全字符 0-9 A-Z a-z (base62 编码)

  • 令牌的到期时间应在个位数小时内。

  • 令牌应该被标记为已使用,在用户拥有 成功设置新密码。

  • 当用户更改密码或请求另一个密码时 重置,使已与其帐户关联的所有令牌过期。

这些是我发现的一些要点。应该考虑哪些其他安全问题?

来源: Secure password-reset function Ycombinator News

【问题讨论】:

    标签: rest authentication restful-authentication


    【解决方案1】:

    我见过的其他一些做法:

    • 检查用户与触发重置密码请求的计算机/浏览器/IP 位于同一台计算机/浏览器/IP 上(除非它是由管理员/系统发起的)。
    • 可以为帐户生成的重置令牌的速率限制数量。

    还应注意,最佳实践通常是使用已建立的库,而不是发明自己的机制,因为有太多东西可能被忽略。

    【讨论】:

    • +1 用于使用已建立的库。生活和呼吸安全的人会犯错误。如果你不这样做,你的情况会更糟,而且你会有更少的白帽子来找到它们。
    • 你能推荐任何与 python-social-auth 和 Django Rest 框架一起使用的库吗?
    • 似乎有这个github.com/Tivix/django-rest-auth,但我对 Python/Django 的了解还不足以说它是最好的。您可以尝试在 slant.co 或其他地方询问(因为“什么是最好的 X”对于 SO 来说是可悲的题外话)。
    【解决方案2】:

    我有同样的问题,找到了OWASP Forgot Password Cheat Sheet。 还有几点我想补充的:

    1. 通常,如果用户输入了不存在的电子邮件站点,则会显示消息“密码恢复链接已发送”。这是为了防止黑客确定系统中存在该电子邮件的用户。但恕我直言,最好说用户电子邮件不存在,因为通常它可能不记得注册期间使用的电子邮件。
    2. 最好向用户添加一些额外的个人问题,例如生日日期。如果黑客窃取了用户的电子邮件,则更难接收重置链接。但由于网站管理员可能会将重置链接发送给用户,因此生日问题必须在通过链接打开的更改密码页面上。
    3. 黑客可能会自动向某些用户发送大量信件。有些网站在电子邮件附近使用 CAPTCHA 字段来防止这种情况发生。
    4. 成功更改密码后,应关闭所有活动会话,并且必须注销用户。因此,即使黑客登录了,他也会退出。
    5. 最好像密码一样散列恢复票证。这里应该使用与密码相同的hashing algorithms:Argon2、SCrypt、BCrypt。
    6. 用户恢复密码后,最好将其标记为可能的欺诈行为,并且在一段时间内(例如一周)不允许进行一些关键操作,例如从帐户中提取资金。
    7. 此外,一些网站正在向用户发送一封信,告知其密码已更改。当用户登录时,他们会这样做,通常手动更改它,但也许在重置 pwd 时发送相同的后者是好的。

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 2017-07-06
      • 2015-02-03
      • 2013-09-25
      • 2013-10-23
      • 1970-01-01
      • 2018-11-11
      相关资源
      最近更新 更多