忘记登录- PHP问题


Forgot Login - PHP Issue

我有一个接受用户名和密码的登录系统。

创建帐户时,用户输入详细信息(姓名、地址、电子邮件密码等)。我md5密码并将它们存储在数据库....

我的问题是如何实现一个忘记登录页面md5d密码....我想创建一些自动电子邮件服务,通过电子邮件将密码发送到提供的电子邮件地址..但我正在努力弄清楚如何实现这一点,因为我从未访问过明文密码,只有加密密码…

你不会用电子邮件发送用户的密码。你通常会给他们发一个新的自动生成的临时密码。

您生成一个新的随机密码并通过电子邮件发送给他们。恢复密码是不实际的,这是存储哈希而不是密码的部分原因。这使得安全漏洞不那么严重。

您根本不需要发送用户旧密码。

您可能可以发送1-time认证链接(登录用户无需密码)或只发送新生成的密码

你会注意到大多数(有信誉的!)网站只允许你重置密码,不给你你的旧密码。

这就是为什么。:)

当您使用md5密码时,几乎不可能获得明文密码。您需要做的是"重置"密码:将其设置为其他内容并通过电子邮件发送给用户

以下是一些选项:

  • 在注册过程中,您可以要求用户设置一些"秘密问答"。

    • 当用户初始化密码重置功能时,他可以回答这些问题并重置密码。
    • 或者,一旦问题回答正确,您可以通过电子邮件向他发送新的临时密码。
  • 你可以发邮件给他们一个特殊的链接。点击此链接即可设置新密码。

  • 发送包含用户密码的电子邮件是一种糟糕的做法(一旦密码被md5'ed,几乎不可能)。另一种选择是:

    获取用户的电子邮件,并发送一个允许用户更改密码的电子邮件链接。链接应该存储在另一个DB表中,并且应该具有与之关联的某种长唯一id。当请求链接时,显示一个表单来更改密码。然后,md5()输入新密码并替换数据库中用户的密码。

    if($_POST['submit'] == 'Send Reset Password Link') {
        if(//User exists & email is valid (check mysql)) {
            $db->prepare('INSERT INTO reset VALUES('', :email, :linkid)');
            //etc...
            mail($email, 'Password Reset for myawesomesite.com', 'Here is your link: http://www.myawesomesite.com/reset.php?id='.$linkid.'&email='.urlencode($email));
            echo "Email sent";
        }
    }
    

    reset.php:

    if(isset($_GET['id']) && isset($_GET['email'])) {
        $q = $db->prepare('SELECT id FROM reset WHERE email=:email AND linkid=:linkid');
        $q->bindParam(':email', $_GET['email']);
        $q->bindParam(':linkid', $_GET['id']);
        $q->execute();
        if($q->rowCount() == 1) {
            //Show password reset form
        } else {
            echo "Reset link invalid";
        }
    }
    

    那么你可以使用UPDATE users WHERE email='' SET password=''来重置密码

    编辑
    我建议不要向用户发送临时密码,除非您的忘记密码表单在用户的电子邮件之外有一层安全保护。如果没有,任何知道用户邮箱的人都可以重置密码。此外,电子邮件通常是未加密的,我认为通过电子邮件发送密码(临时或非)是不安全的。