Когда пользователь сбрасывает пароль, отправляя свой адрес электронной почты. Письмо, которое они получают, выглядит примерно так.

Электронная почта

http://localhost/folder/folder/reset.php?email=foobar@foo.com&hash=07c5807d0d927

При щелчке по указанной выше ссылке пользователь вводит Новый пароль и Подтверждение пароля. Мы получаем электронное письмо и адрес электронной почты. Код ниже.

reset.php

if( isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['hash']) && !empty($_GET['hash']) ) {
    $email = $con->escape_string($_GET['email']);
    $hash = $con->escape_string($_GET['hash']);
    $result = $con->query("SELECT * FROM users WHERE email='$email' AND hash='$hash'");
    if ( $result->num_rows == 0 ) {
        $_SESSION['message'] = "Invalid URL for password reset!";
        header("location: ../error.php");
    }
}
else {
    $_SESSION['message'] = "Verification failed, try again!";
    header("location: ../error.php");
}

<!-- form goes here -->

Мы используем приведенный ниже код, чтобы проверить соответствующий пароль.

resetpassword.php

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Make sure the two passwords match
if ( $_POST['newpassword'] == $_POST['confirmpassword'] ) {
    $new_password = password_hash($_POST['newpassword'], PASSWORD_BCRYPT);

    // We get $_POST['email'] and $_POST['hash'] from the hidden input field of reset.php form
    $email = $con->escape_string($_POST['email']);
    $hash = $con->escape_string($_POST['hash']);

    $sql = "UPDATE users SET password='$new_password', hash='$hash' WHERE email='$email'";

    if ( $con->query($sql) ) {
    $_SESSION['message'] = "Your password has been reset successfully! <a href='login.php'>Login</a>";
    header("location: ../success.php");

    }
}
else {
    $_SESSION['message'] = "Passwords did not match, try again!";
    header("location: ../reset.php");
}
}

Теперь проблема здесь. Если пароль пользователя не совпадает, он переходит на страницу reset.php, а когда ему нужно вернуться, чтобы повторить попытку. Когда это произойдет, как нам вернуть их email и hash?

  else {
    $_SESSION['message'] = "Passwords did not match, try again!";
    header("location: ../reset.php");
}

Это то, что мы получаем, когда они возвращаются. http://localhost/folder/folder/reset.php

-1
Dexter 11 Мар 2018 в 13:31

1 ответ

Лучший ответ

Здесь лучше всего использовать сеансы.

В настоящее время в коде есть еще одна проблема, которой вы, возможно, захотите избежать. Ваш пользователь может перейти на страницу resetpassword.php с ЛЮБЫМ адресом электронной почты и сбросить пароль для этого адреса электронной почты, что может привести к очень неприятной проблеме безопасности.

Правильный способ сделать то, что вы собираетесь делать, был бы

Reset.php

<?php

$email = array_key_exists('email', $_GET) && !empty($_GET['email']) ? $_GET['email'] : null;
$hash = array_key_exists('hash', $_GET) && !empty($_GET['hash']) ? $_GET['hash'] : null;

session_start();

if( $email !== null && $hash !== null) {
    $email = $con->escape_string($email);
    $hash = $con->escape_string($hash);
    $result = $con->query("SELECT * FROM users WHERE email='$email' AND hash='$hash'");

    if ( $result->num_rows == 0 ) {
        $_SESSION['message'] = "Invalid URL for password reset!";
        header("location: ../error.php");
    } else {
        $_SESSION['reset_email'] = $email;
        $_SESSION['reset_hash'] = $hash;
        // do redirect to your new password page or smth
    }
}
else {
    $_SESSION['message'] = "Verification failed, try again!";
    header("location: ../error.php");
}

И resetpassword.php

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('reset_email', $_SESSION) && !empty($_SESSION['reset_email'])) {
// Make sure the two passwords match
    if ( $_POST['newpassword'] == $_POST['confirmpassword'] ) {
        $new_password = password_hash($_POST['newpassword'], PASSWORD_BCRYPT);

        // not sure why you would need to update password reset hash there, so i removed it
        $sql = "UPDATE users SET password='$new_password' WHERE email='{$_SESSION['reset_email']}'";

        if ( $con->query($sql) ) {
            $_SESSION['message'] = "Your password has been reset successfully! <a href='login.php'>Login</a>";
            $_SESSION['reset_email'] = null;
            $_SESSION['reset_hash'] = null;
            header("location: ../success.php");
        } else {
            // error probably a good thing here (for the user)
            $_SESSION['message'] = "Verification failed, try again!";
            header("location: ../error.php");
        }
    }
    else {
        $_SESSION['message'] = "Passwords did not match, try again!";
        header("location: ../reset.php?email={$_SESSION['reset_email']}&hash={$_SESSION['reset_hash']}");
    }
}
1
Bogdans 11 Мар 2018 в 16:46