【问题标题】:Password reminder with md5-encrypted passwords使用 md5 加密密码的密码提醒
【发布时间】:2015-01-13 09:45:18
【问题描述】:

我正在创建“忘记密码?”我网站的页面。

显然,当新用户创建帐户时,php 脚本会使用 md5 算法对选择的密码进行加密。

现在,一切正常,除了当用户使用“忘记密码页面”请求密码提醒时,他收到的电子邮件返回的是 md5 加密的密码,而不是真实密码。

以下是我正在使用的代码。

$query2="SELECT password FROM users WHERE email='$email'";
$risultato2 = mysql_query($query2) or die ($query2);
while ($row = mysql_fetch_array($risultato2))
{
     $passToSend = md5($row['password']);
}

echo "<center>We have sent an e-mail to <b>".$email."</b> containing a link to recover your     password.</center>";

$mittente = 'From: "My website" <mywebsite@service.com> '; 
$destinatario = $email;  
$oggetto = "Recover your password"; 
$messaggio = "The password you've choosen during the sign up process is: ".$passToSend."\n\nIf    you'd like to change your password, please visit    http://www.mywebsite.com/mydashboard/changepwd.php\n\n Please ignore this message if you haven't requested a password reminder.";                 
mail($destinatario, $oggetto, $messaggio, $mittente);

我能做什么?

【问题讨论】:

    标签: php sql encryption passwords md5


    【解决方案1】:

    切勿尝试提供允许人们恢复密码的功能。如果您正确存储密码,那应该是不可能的。

    注意:您应该在将密码放入数据库之前对其进行哈希处理,而不是在取出密码时进行哈希处理,并且 MD5 为an unsuitable hashing algorithm,因此您需要使用用户密码的take better care。

    生成一个由随机字符组成的标记(让它变得很长)。将其存储在用户 ID(或用户表的主键)和时间戳旁边的表中。通过电子邮件向用户发送该令牌(为方便起见,将其嵌入 URL 中)。当他们点击链接时,给他们一个表格,允许他们为他们的帐户设置一个新密码(您可以从令牌中识别)。

    在他们重置密码后删除令牌,它应该是一次性令牌。

    使用 cron 作业删除在某个时间段(例如 24 小时)之后未使用的令牌。

    【讨论】:

    • 最好只存储令牌的 hash,否则具有数据库读取权限(SQL 注入)的攻击者可以请求重置,读取令牌并有权访问该帐户。
    • 或者让令牌“过期”。换句话说,通常将数据库中的该列留空,并且仅在用户请求重置密码时使用随机生成的令牌填充它。然后应在重置后或几个小时后再次清除该列,以先到者为准。
    • 谢谢大家,我会按照你们的指示去做的,你们都说得很清楚很有用。再次感谢。
    • @MichaelGoldstein - 这实际上是 Quentin 写的,“删除未使用的令牌......”。甚至不需要删除带时间戳的令牌,只需在用户单击链接时检查令牌是否仍然有效。
    • 啊@martinstoeckli 这很有意义。比我建议的更有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 2016-10-15
    • 2014-08-01
    • 2021-04-10
    • 2011-07-14
    • 2023-03-30
    相关资源
    最近更新 更多