发送安全的临时密码

时间:2011-10-21 11:32:21

标签: php security email login passwords

我正在创建一个忘记的密码页面,并将向用户发送临时密码,以便他们登录并重置密码。

创建密码时我应该考虑什么,最好的方法是什么。

我的想法是:$temporarypassword = sha1($_SERVER['REMOTE_ADDR'])

试图只允许他们从他们请求临时密码的ip地址登录。这样做的最佳方法是什么?

到目前为止

代码:

      if(strpos($_SERVER['HTTP_REFERER'],'domain.com') && ($_POST['forgotpasstoken'] == sha1($_SESSION['token'].'forgotpassword'))){
        if(isset($_POST['forgotemail']) && !empty($_POST['forgotemail'])){
            $email = mysql_escape_string(trim($_POST['forgotemail']));

            if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE){
                echo '<div class="error">Please enter a valid email address.</div>';
            } else {
                $sql = "SELECT email FROM users WHERE email = '$email' LIMIT 1";
                            $res = mysql_query($sql) or die(mysql_error());
                                if (mysql_num_rows($res) > 0) {

                                    //If email/user exists
            $temporarypassword = sha1($_SERVER['REMOTE_ADDR'])  
                //EMAIL PASSWORD HERE           

        echo '<div class="success">A temporary recovery password has been emailed to you.</div>';
                                    //If email/user exits
                                } else {
                                    echo '<div class="error">This email is not registered.</div>';
                        }
            }

        } else {
        echo '<div class="error">Please enter an email address.</div>'; 
        }

}

2 个答案:

答案 0 :(得分:2)

只使用随机字符串:用户很可能尝试从例如iPhone失败,请求新密码,只有当他在家里的电脑上时才打开链接。 IP不同,设备不同,一切都不同。

答案 1 :(得分:1)

如果您通过电子邮件发送密码,则无法使其完全安全。电子邮件以纯文本形式传输。和alf所说的一样,用户可以从与他们请求的IP地址不同的IP地址重置密码。

一个选项是创建一个随机字符串,然后在密码重置页面上显示一半(在发出重置请求之后)和电子邮件中字符串的一半。然后要求用户在让他们选择新密码之前在表单中输入两个部分。