Ошибка даже когда все правильно
Я использую следующий код для забытого пароля в моей системе входа в систему php, но все же позже появляется ошибка Имя пользователя или Пароль неверны Файл забыл пароль.php. Теперь я получаю сообщение об ошибке, указав неверное имя пользователя или адрес электронной почты, но мои данные верны и указаны в соответствии с таблицей mysql. Это мой код:-(на хостинг-сервере, поэтому некоторая информация скрыта).
session_start();
require_once 'Phpmailer/PHPMailerAutoload.php';
if (isset($_SESSION['id'])) {
header('Location: user.php');
die();
}
else {
if($_POST['submit']) {
$username = strip_tags($_POST['username']);
$uemail = strip_tags($_POST['email']);
$db = mysqli_connect("localhost", "username", "password", "thedb") or die ("Failed to connect");
$sql = "SELECT id,username,password FROM members where username = '$username' LIMIT 1";
$query = mysqli_query($db, $sql);
if($query) {
$row = mysqli_fetch_row($query);
$dbUserName = $row[1];
$dbUserId = $row[0];
$dbEmail = $row[4];
}
if($username == $dbUserName && $uemail == $dbEmail) {
$_SESSION['username'] = $username;
$_SESSION['id'] = $id;
$token = rand(10);
$db->query("UPDATE members SET token='$token' WHERE id='id'");
$url = "https://www.example.net/resetpass?token=$token" ;
$mail = new PHPMailer(true); // Passing
`true` enables exceptions
try {
//Server settings
$mail->isSMTP(); // Set mailer to use
SMTP
$mail->Host = 'example.net'; // Specify main and
backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP
authentication
$mail->Username = 'members@example.net'; // SMTP username
$mail->Password = 'password'; // SMTP password
$mail->SMTPSecure = 'ssl'; // Enable TLS
encryption, `ssl` also accepted
$mail->Port = 465; // TCP port to connect
to
//Recipients
$mail->setFrom('members@example.net', 'example');
$mail->addAddress('$uemail'); // Add a recipient
//Content
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = 'Reset Password Request';
$mail->Body = 'We recieved an request for resseting password for user $username, please click the following link for resetting password $url';
//$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
$mail->send();
$suc = 'Message has been sent';
} catch (Exception $e) {
$err = 'Message could not be sent.';
}
$reset_passwordsuc = "<b><i>Instructions sent to user email.</i><b>";
}
else {
$reset_password = "<b><i>Username or Email Incorrect</i><b>";
}
}
}
?>
Наконец я получил имя пользователя или адрес электронной почты неверно. Пожалуйста помоги
1 ответ
Вы должны изменить способ проверки имени пользователя и электронной почты. Пожалуйста, используйте следующие модификации.
Изменить:
$sql = "SELECT id,username,password FROM members where username = '$username' LIMIT 1";
Для того,чтобы:
$sql = "SELECT id,username,password, email FROM members WHERE email LIKE '$uemail' AND username = '$username' LIMIT 1";
Изменить:
if($username == $dbUserName && $uemail == $dbEmail) {
Для того,чтобы:
if(mysqli_num_rows($query) == 1) {
Для работы токена выполните следующие модификации.
Изменить:
$_SESSION['id'] = $id;
Для того,чтобы:
$_SESSION['id'] = $dbUserId;
Изменить:
$db->query("UPDATE members SET token='$token' WHERE id='id'");
Для того,чтобы:
mysqli_query($db, "UPDATE members SET token='$token' WHERE id='$dbUserId'");
PS: Вы можете использовать подготовленные операторы для предотвращения атак с использованием SQL-инъекций.