#php
#php
Вопрос:
Я всегда могу войти в систему, даже если пароль неверен.
Я попытался изменить if (password_verify($this->concatPasswordWithSalt($password, $salt), $passwordHash))
на if ('aaa' === 'bbb')
, но он также возвращает true…
Вот некоторый код:
function getUser($email, $password)
{
$query = "SELECT name, password, salt FROM user WHERE email = ?";
if ($stmt = $this->con->prepare($query)) {
$stmt->bind_param("s", $email);
$stmt->execute();
$stmt->bind_result($name, $passwordHash, $salt);
if ($stmt->fetch()) {
if (password_verify($this->concatPasswordWithSalt($password, $salt), $passwordHash)) {
return true;
} else {
return false;
}
} else {
return false;
}
$stmt->close();
}
}
function concatPasswordWithSalt($password, $salt)
{
global $random_salt_length;
if ($random_salt_length % 2 == 0) {
$mid = $random_salt_length / 2;
} else {
$mid = ($random_salt_length - 1) / 2;
}
return
substr($salt, 0, $mid - 1) . $password . substr($salt, $mid, $random_salt_length - 1);
}
Я вставляю хэш пароля в базу данных с помощью этого кода:
$passwordHash = password_hash($db->concatPasswordWithSalt($password, $salt), PASSWORD_DEFAULT);
function getSalt()
{
global $random_salt_length;
return bin2hex(openssl_random_pseudo_bytes($random_salt_length));
}
Редактировать:
Пытался добавить return false
в конце getUser
, но он все еще не работает. Так что, возможно, что-то не так в login.php:
if (isset($input['email']) amp;amp; isset($input['password'])) {
$email = $input['email'];
$password = $input['password'];
if (!$db->getUser($email, $password)) {
$response['status'] = 0;
$response['message'] = "Login successful";
} else {
$response['status'] = 1;
$response['message'] = "Invalid email or password";
}
} else {
$response['status'] = 2;
$response['message'] = "Missing mandatory parameters";
}
Комментарии:
1. Вы можете безопасно удалить все
return false;
ветви в своем коде и поместить только одну в конце функции. (Вероятно, именно здесь происходит сбой, потому что он возвращается,null
и если вы проверяетеfalse
явно, это может быть причиной. Было бы более уместно проверить, соответствует ли значение действительности (и принять логин), и вы были бы в безопасности от подобных ошибок в будущем).2. Какие
$response
значения вы получаете? Где создается$input
массив? Вы имели в виду$_REQUEST
?3. @dearsina я получаю
Login successful
. Кроме того, вы были правыif ($stmt = $this->con->prepare($query)) {
, это действительно сбой, но я не понимаю почему, запрос правильный.$input
массив создается в login.php файл:$inputJSON = file_get_contents('php://input'); $input = json_decode($inputJSON, TRUE);
.
Ответ №1:
Ваша проблема:
if (!$db->getUser($email, $password)) {
$response['status'] = 0;
$response['message'] = "Login successful";
}
Если getUser
функция возвращает FALSE
, скажите, что вход в систему прошел успешно. Вы добавили к функции префикс !
.
Комментарии:
1. Пробовал это, но все еще не работает. Я отредактировал свой вопрос.