Всегда может войти в систему, даже если пароль неверный

#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. Пробовал это, но все еще не работает. Я отредактировал свой вопрос.