【问题标题】:php send user password via emailphp 通过电子邮件发送用户密码
【发布时间】:2015-06-10 23:21:07
【问题描述】:

我们都知道我们不应该将用户密码作为纯文本存储在 数据库。但是我看到了一些已经实施的网站 发送忘记密码功能。所以如果我问我的密码,我输入 我的电子邮件,他们发送密码。 注意:我说的不是密码更改 (http://sample.com/forgot_pass?token=ddm39fhksnc)

这些网站是如何实现的?他们将普通密码存储在他们的 数据库(可能是不同的数据库),因为据我所知 无法将密码哈希反转为其构建的原始字符串...

无论如何这个功能可以安全地实现吗?或者我应该 说服客户坚持使用 forgot-pass-link 方法。

谢谢。

【问题讨论】:

  • 通常发生的情况是,当他们向您发送密码时。他们已经自动生成了一个临时密码。
  • 不,我的意思是实际密码。不是临时的。

标签: php passwords forgot-password


【解决方案1】:

如果您将实际密码存储在数据库中,则会打开重大安全问题的大门。但是,如果事实上您必须将他们的密码重新发送给他们,您可以这样做的一种方法是,当他们注册时,将密码存储在位于公共目录之外的文本文件中。

然后创建某种命名逻辑,将记录与文本文件相关联。然后从那里开始,使您可以访问该文本文件的唯一方法是进行适当的安全检查,然后通过您的脚本。

【讨论】:

    【解决方案2】:

    我的解决方案是在我的数据库中的“user”表中添加两个字段:“token”字段和“expired_time”字段。

    1. 当用户发送重置密码请求时,您的应用程序将更新令牌字符串和过期时间以重置该用户的密码。

    2. 发送带有链接的电子邮件,其中包含用户名(或电子邮件,或 ID,...)和令牌,如 http://example.com/resetpassword.php?id=userid&token=token

    3. 在 resetpassword.php 中,您将通过用户 ID、令牌和过期时间(可能是 5 分钟)检查身份验证

    4. 允许用户更改密码。

    这是我的解决方案,希望对您有所帮助:)

    【讨论】:

      【解决方案3】:

      如果他们能够将您的密码发送给您,那么他们会以纯文本形式存储您的密码。

      请注意,如果使用了已弃用的哈希函数(如 md5),您可以从哈希中找出原始密码。

      没有办法安全地做到这一点。如果您的数据库遭到破坏,攻击者将能够读出所有密码和相应的电子邮件地址/用户名。如果您的用户在不同的网站上重复使用相同的密码(大多数人都会这样做),会发生什么情况。

      即使有一种“安全”的方法可以从其哈希中找出密码,又有什么能阻止攻击者这样做呢?

      【讨论】:

        【解决方案4】:

        此类功能无法安全实施。如果应用程序可以检索原始密码(例如,从加密密码中),成功的攻击者也可以检索密码。这就是为什么人们应该使用像 BCrypt、SCrypt 或 PBKDF2 这样的哈希函数。

        另一个弱点是通过电子邮件发送密码。更好的方法是发送一个令牌,并让用户在确认后选择自己的密码。相同的代码可用于注册新用户和重置密码。

        【讨论】:

          猜你喜欢
          • 2018-12-05
          • 2017-02-15
          • 2014-05-23
          • 2011-05-21
          • 2019-07-26
          • 1970-01-01
          • 1970-01-01
          • 2010-11-21
          • 2020-09-16
          相关资源
          最近更新 更多