php通过电子邮件发送用户密码


php send user password via email

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

这些网站是如何实现的?他们在自己的数据库(可能是另一个数据库),因为据我所知无法将密码哈希反转为它生成的原始字符串。。。

有没有这个功能可以安全地实现?或者我应该说服客户坚持使用忘记传递链接方法。

谢谢。

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

请注意,如果使用了不推荐使用的哈希函数(如md5),则可以从哈希中找到原始密码。

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

即使有一种"安全"的方法可以从哈希中找出密码,是什么阻止了攻击者这样做?

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

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

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

然后创建某种命名逻辑,将记录与文本文件关联起来。然后,让它成为你访问该文本文件的唯一方式是进行适当的安全检查,然后通过你的脚本。

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

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

  2. 发送带有链接的电子邮件具有用户名(或电子邮件,或id,…)和类似的令牌http://example.com/resetpassword.php?id=userid&token=令牌

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

  4. 允许用户更改密码。

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