Обновление поля проверяет пароль?

Итак, в качестве побочного проекта для моего образования, я сейчас работаю над системой безопасного входа в систему с использованием PHP и mysqli. Все шло гладко, но теперь я столкнулся с проблемой, с которой мои коллеги, учителя и я сбиты с толку.

Я хэширую и проверяю свои пароли с помощью password_hash и password_verify.

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

А теперь вот кикер: когда я захожу в PHPMyAdmin, копирую хешированный пароль, хранящийся в базе данных, и обновляю поле пароля с этим точным скопированным паролем … это работает. Я могу войти, как и предполагалось, с паролем, который я использовал, и он не выдаст мне никаких ошибок.

У кого-нибудь есть идея, что случилось и как это исправить?

Код, используемый для регистрации:

public function createAccount()
{
global $con;

$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";
$sql='INSERT into user (username, password, email, creation_date)
VALUES (?,?,?,?)';

// Prepare statement
$stmt = $con->prepare($sql);
if($stmt === false) {
trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR);
}

// Bind parameters. Types: s = string, i = integer, d = double,  b = blob
$stmt->bind_param('ssss',$this->username,$this->password,$this->email,$this->creationDate);

// Execute statement
$stmt->execute();

echo $stmt->insert_id;
echo $stmt->affected_rows;

$stmt->close();

$_SESSION['login'] = true;
$_SESSION['username'] = $username;
Header("Location: index.php");
}

Код, используемый для проверки учетных данных:

public function fetchCredentials() {
// Select a set of credentials from the username given in form and return as array
global $con;
$sql = 'SELECT id, password FROM user WHERE username = ?';

// Prepare statement
$stmt = $con->prepare($sql);
if($stmt === false) {
trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR);
}

// Bind parameters. Types: s = string, i = integer, d = double,  b = blob
$stmt->bind_param('s',$this->username);

// Execute statement
$stmt->execute();

// Store all results in an array
$rs=$stmt->get_result();
$arr = $rs->fetch_all(MYSQLI_ASSOC);
$stmt->close();

return($arr);
}

public function validateCredentials() {
// Get credentials
$arr = $this->fetchCredentials();

// Validate username
if (count($arr) > 1) {
$this->error = 'crit';
$this->abort = true;
} else if (count($arr) < 1) {
$this->error = 'badLogin';
$this->abort = true;
} else {
$arr = $arr[0];
}

echo $arr['password'].'<br>'.$this->password;
// Validate password. NOTE: This is where the issue arises. Password_verify() will return false where it    should return true.
if ($this->abort == false && !password_verify($this->password, $arr['password'])) {
$this->error = 'badLogin';
$this->abort = true;
}

// Return values if needed
if ($this->abort == false) {
$this->id = $arr['id'];
}
return $this->abort;
}

Часть, которая вызывает вход в систему: (Да, функция validatecredentials вызывается дважды. Да, есть некоторые другие вещи, которые не очень хорошо написаны. Эта часть кода все еще нуждается в некоторой работе, и это первое Я сделаю после устранения проблемы выше)

function login()
{
$newCred = new credentials(
$_POST['username'],
$_POST['password']);

if ($newCred->checkForm() == false
&& $newCred->validateCredentials() == false) {
$newLogin = new login(
$newCred->validateCredentials()['id']);

$newLogin->login();
$newLogin->getUserDetails();
} else {
$newCred->fetchError();
}
}

0

Решение

Хорошо, всем, кто помог: Спасибо. Мне только что помог мой одноклассник, и он сумел найти проблему. Я бью себя прямо сейчас.

$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";

Вот. «\ П». Новая строка Я взял свой код из примера, и это было по какой-то причине. Когда я обновил базу данных, новая строка была удалена.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]