Php 发送安全临时密码

Php 发送安全临时密码,php,security,email,login,passwords,Php,Security,Email,Login,Passwords,我正在创建一个忘记密码页面,并将通过电子邮件向用户发送临时密码,以便他们可以登录并重置密码 创建密码时应该考虑什么,最好的方法是什么 我的想法是:$temporarypassword=sha1($\u SERVER['REMOTE\u ADDR']) 试图只允许他们从请求临时密码的ip地址登录。最好的方法是什么 迄今为止的代码: if(strpos($_SERVER['HTTP_REFERER'],'domain.com') && ($_POST['forgotpas

我正在创建一个忘记密码页面,并将通过电子邮件向用户发送临时密码,以便他们可以登录并重置密码

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

我的想法是:
$temporarypassword=sha1($\u SERVER['REMOTE\u 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>'; 
        }

}
if(strpos($_SERVER['HTTP\u REFERER'],'domain.com')&($_POST['forgotpasstoken']==sha1($_SESSION['token']。'forgotpassword')){
如果(设置($_POST['forgotemail'])和&!空($_POST['forgotemail'])){
$email=mysql\u escape\u字符串(trim($\u POST['forgotemail']);
if(filter\u var($email,filter\u VALIDATE\u email)==FALSE){
echo“请输入有效的电子邮件地址”;
}否则{
$sql=“选择来自电子邮件=“$email”限制为1”的用户的电子邮件;
$res=mysql\u query($sql)或die(mysql\u error());
如果(mysql_num_rows($res)>0){
//如果存在电子邮件/用户
$temporarypassword=sha1($\u服务器['REMOTE\u ADDR']))
//电子邮件密码在这里
echo“已通过电子邮件向您发送临时恢复密码”;
//如果电子邮件/用户退出
}否则{
echo“此电子邮件未注册”;
}
}
}否则{
echo“请输入电子邮件地址”;
}
}

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

如果你通过电子邮件发送密码,没有办法使其完全安全。电子邮件以纯文本传输。正如alf所说,用户可以从不同的IP地址重置密码,而不是从他们请求的IP地址重置密码


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

我不建议这样做。IP可以更改,用户可以在重置IP或其他任何内容后接收邮件。我建议使用完全随机的密码,它只能在短时间内使用。别忘了通知用户。现在这个半+半(或任何可能的变化)真是个聪明的主意!为什么我以前没有听说过呢?