PHP Сообщение проверки логина, отображаемое, когда пароль верный - PullRequest
1 голос
/ 24 апреля 2020

Я создал страницу входа для моего сайта, используя PHP. Для проверки я хотел бы, чтобы сообщения об ошибках отображались, если имя пользователя не существует, если пароль неправильный или если пользователь не ввел ни того, ни другого. Большая часть моей проверки работает, за исключением проверки правильности пароля. Код, который я использовал ниже. Я считаю, что проблема с паролем if_verify. Сообщение об ошибке, предлагающее пользователю ввести неверный пароль, появляется даже тогда, когда пароль правильный.

<?php
// Initalise session
session_start();

//Check if the user is already logged in, if yes then redirect to members page
if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true){
header("location: members.php");
exit;
}

//Include config file
require_once "config.php";

//Define variables and initalise with empty values
$username = $password = "";
$username_err = $password_err = "";

//Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){

   //Check if username is empty
   if(empty(trim($_POST["username"]))){
      $username_err = "Please enter your username.";
   } else{
      $username = trim($_POST["username"]);
   }

   //Check if password is empty
   if(empty(trim($_POST["password"]))){
      $password_err = "Please enter your password.";
   } else{
      $password = trim($_POST["password"]);
   }

//Validate credentials
if(empty($username_err) && empty($password_err)){
    //Prepare a select statement
    $sql = "SELECT username, password FROM users WHERE username = ?";

    if($stmt = $mysqli->prepare($sql)){
        //Bind variables to the prepared statement as parameters
        $stmt->bind_param("s", $param_username);

        //Set parameters
        $param_username = $username;

        //Attempt to execute the prepared statement
        if($stmt->execute()){
            //Store result
            $stmt->store_result();

            //Check if username exists, if yes then verify password
            if($stmt->num_rows == 1){
                //Bind result variables
                $stmt->bind_result($username, $password);

                if($stmt->fetch()){
                    if(password_verify($password, $_POST['password'])){
                        //Password is correct, so start a new session
                        session_start();

                        //Store data in session variables
                        $_SESSION["loggedin"] = true;
                        $_SESSION["username"] = $username;

                        //Redirect user to members page
                        header("location: members.php");
                    } else {
                        //Display an error message if password is not valid
                        $password_err = "The password you entered was not valid.";
                    }
                }
            } else{
                //Display an error message if username doesn't exist
                $username_err = "No account found with that username.";
            }
        } else{
            echo "Oops! Something went wrong. Please try again later.";
        }

        //Close statement
        $stmt->close();
    }
}

//Close connection
$mysqli->close();
}
 ?>

1 Ответ

3 голосов
/ 24 апреля 2020

Ваши переменные триггер :

if(password_verify($password, $_POST['password'])){

должно быть

if(password_verify($_POST['password'], $password)){

ПРИМЕЧАНИЯ

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

Хэши паролей в PHP имеют длину не менее 60 символов , убедитесь, что в столбце, в котором вы находитесь хранение пароля больше для обработки будущих алгоритмов хеширования. VARCHAR(255) или TEXT имеет достаточно места для размещения будущих хэшей.

...