繁体   English   中英

PHP忘记密码

[英]PHP forgot password

我试图在 PHP 中为用户创建一个忘记密码的页面,但是当我输入代码时,页面只是重新加载,没有其他任何事情发生。 没有错误没什么。

if($submit){
    $email = mysqli_real_escape_string($conn, $_POST["email"]);
    $submit = $_POST['submit'];

    $email_check = mysqli_query($conn ,"SELECT * FROM users WHERE email='" . $email. "'");
    $count = mysqli_num_rows($email_check);

    if($count != 0 ){
        // generate a new password
        $random = rand(72891, 92729);
        $new_password = $random;

        $email_password = $new_password;

        $new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));         

        $new_password = password_hash($new_password);

        mysqli_query("update users set pw='" . $new_password. "' WHERE email='" . $email. "'");

        $subject = "Login information";
        $message = "Your password has been changed to $email_password";
        $from = "From: example.me";

        mail($email, $subject, $message, $from);
        echo "Your new password has been sent to you";
    } else {
        echo"This email does not exists";
    }
}

我会在这里告诉你你的代码到底发生了什么。

第1部分:

if($submit){
    $email = mysqli_real_escape_string($conn, $_POST["email"]);
    $submit = $_POST['submit'];
  • $submit = $_POST['submit']; 在您打开if($submit)后分配。
  • 结果与错误报告:未定义的提交变量。

第2部分:

$new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));         
$new_password = password_hash($new_password);

您正在尝试双重哈希,这不会给您带来任何额外的好处,并且在稍后尝试验证时也会失败。 这里发生的事情是第二个失败了,甚至根本不应该使用。

为什么失败了? 因为,它缺少一个参数。

  • 结果:

    警告:password_hash() 需要至少 2 个参数,第 1 个在 /path/to/file.php 第 x 行中给出

  • 添加的结果:一个空的密码行(当更新发生时。参见“第 3 部分”)。

第 3 部分:

mysqli_query("update users set pw='" . $new_password. "' WHERE email='" . $email. "'");

该查询不包含它的数据库连接。

  • 结果:

    警告:mysqli_query() 需要至少 2 个参数,1 个在第 x 行的 /path/to/file.php 中给出

关于您的变量和使用的连接 API 是未知的,因此您必须确保使用相同的 MySQL API 进行连接,并且您的变量和 POST 数组包含值。

错误报告会对您有所帮助,检查查询中的错误也会有所帮助。

参考:


最后说明:

改用准备好的语句,这样更安全

还; 您应该让用户在重置时使用唯一/一次性令牌选择自己的密码,并将其散列“一次”,而不是两次,并且不应该邮寄他们的密码,原因有很多。 这是最常见的做法。 如果用户的电子邮件帐户遭到入侵并且他们没有删除包含其登录密码的电子邮件,那么他们的登录帐户也将面临风险。

$submit直到验证您的if语句后才声明。

使用另一个变量进行验证。 好的开始是检查$_POST是否已提交

if ($_SERVER['REQUEST_METHOD'] == 'POST')

通过电子邮件发送密码更改

$message = "Your password has been changed to $email_password";

$message = "Your password has been changed to {$email_password}";

存储在数据库中的密码已被散列两次。 消除

$new_password = password_hash($new_password);

需要执行 SQL 来更新数据库中的密码哈希。

$sql = "update users set pw='" . $new_password. "' WHERE email='" . $email. "'";
if (mysqli_query($conn, $sql)) {
   echo "Password updated successfully";
} else {
   echo "Error updating record: " . mysqli_error($conn);
}

mysqli_close($conn);

您正在测试$submit但在测试中定义$submit ,因此$submit可能不会评估为真。

尝试将外部if ($submit)更改为if (!empty($_POST))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM