Система входа в PHP не всегда работает с первого раза — нет сообщения об ошибке, возврат к странице входа

#php #mysql

#php #MySQL

Вопрос:

Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь войти на свой веб-сайт PHP, форма входа часто не переводит пользователя на страницу участников после входа в систему. Вход в систему не работает с первого раза. Затем, после повторного использования тех же учетных данных для входа, это работает. Это происходит не всегда. Иногда это работает с первого раза без проблем, в других случаях вам нужно войти во второй раз, чтобы это сработало.

 <?php
session_start();
require "connection.php";
include "navigation.php";
if(isset($_SESSION['origURL'])){
    $url = $_SESSION['origURL'];
}
$max_time = (time() - 60*60);
$client = $_SERVER['REMOTE_ADDR'];
$check = mysqli_query($conn,"SELECT * FROM login_attempts WHERE ip_address = '$client' AND time >='$max_time'");
$checkrow = mysqli_fetch_array($check);
$tries = mysqli_num_rows($check);
if($tries == 3){
    header("Location: robot.php");
    exit;
}
if ( isset($_COOKIE['userid']) amp;amp; (isset($_COOKIE['username']) amp;amp; ($_COOKIE['userid'] !== ""))){
    header("Location: member.php");
    exit;
}
$error = false;
if(isset($_GET['activated'])){
    $error_msg = "<div style='border: 2px solid green;margin-bottom:5px; padding:7px;'>Token authenticated successfully - your account is now activated.</div>";
}
if(isset($_GET['updated'])){
    $error_msg = "<div style='border: 2px solid orange;margin-bottom:5px; padding:7px;'>Your details have been updated. Please login again for these changes to take effect.</div>";
}
if(isset($_POST['submit'])){
    $var_password = trim($_POST['password']);
    $var_password = strip_tags($var_password);
    $var_password = htmlspecialchars($var_password);
    $var_username = trim($_POST['username']);
    $var_username = strip_tags($var_username);
    $var_username = htmlspecialchars($var_username);
    if (empty($var_username)){
        $error = true;
        $error = 1;
    }else{
        if (empty($var_password)){
            $error = true;
            $error = 1;
        }
    }
    if (!$error){
        $var_password = hash('sha256', $var_password);
        $query = mysqli_query($conn,"SELECT username, password, userid, acc_active FROM users WHERE username = '$var_username'");
        $row = mysqli_fetch_array($query);
        $count = mysqli_num_rows($query);
        $userid = $row['userid'];
        $stat = $row['acc_active'];
        if ($count == 1 amp;amp; $row['username']==$var_username amp;amp; $row['password']==$var_password) {
            if($stat == "active" || $stat == "inactive"){
                $_COOKIE['username'] = $row['username'];
                $_COOKIE['userid'] = $row['userid'];
                $userid = $_COOKIE['userid'];
                setcookie("username", $var_username,  time() 30*24*60*60);
                setcookie("userid", $userid,  time() 30*24*60*60);
                $stmt = $conn->prepare("DELETE FROM login_attempts WHERE ip_address=?");
                $stmt->bind_param("s",$client);
                $stmt->execute();
                $stmt->close();
                if(isset($url)){
                    header("Location: $url");
                }else{
                    header("Location: member.php");
                }
            }else{
                if($stat == "disabled"){
                    $error_msg = "<div style='border: 2px solid red;margin-bottom:5px; padding:7px;'>Account does not exist, or it is banned/disabled.</div>";
                }
                if($stat == "notverified"){
                    $error_msg = "<div style='border: 2px solid red;margin-bottom:5px; padding:7px;'>Account is inactive. Please check your inbox / spam for activation token.</div>";
                }
            }
        } else {
            $error = 1;
        }
    }else{
        $error = 1;
    }
    if($error == 1){
        $when = time();
        $stmt = $conn->prepare("INSERT INTO login_attempts(ip_address, username, time) VALUES(?,?,?)");
        $stmt->bind_param("sss", $client, $var_username, $when);
        $stmt->execute();
        $stmt->close();
        $tries = $tries   1;
        $error_msg = "<div style='border: 2px solid orange;margin-bottom:5px; padding:7px;'>".$tries. " of 3 login attempts used.</div>";
    }

}
?>
<html>
<head>
    <title>Login</title>
    <link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body>
<div class="login-container">
    <h2 class="login-header">Login</h2>
    <?php echo $error_msg; ?>
    <form method="post" action="" style="text-align:center">
        <input type="text" placeholder="Username...(case sensitive)" name="username" />
        <input type="password" placeholder="Password..." name="password" />
        <input type="submit" name="submit" value="Login"/>
        <br />
        or...
        <br />
        <a href="/rail/reset-password" class="login-btn-alt">Reset Password</a>
        <br />
        <a href="/rail/register" class="login-btn-alt">Register Here</a>
    </form>

</div>
</body>
</html>
  

Любое разъяснение относительно того, почему вход в систему не всегда работает с первого раза, было бы здорово.
Просто для подтверждения, это не сбой входа в систему. При неудачном входе в систему с неверными учетными данными будет отображаться сообщение, насчитывающее до 3. В консоли проверки etc или журнале ошибок apache2 нет сообщений об ошибках или проблемах.
Заранее спасибо.

Комментарии:

1. В чем польза $checkrow ?

2. Вы знаете, что если ваш пароль содержит пробелы в первых или последних символах, trim($password) это приведет к неверному паролю? То же самое для strip_tags($password) и htmlspecialchars($password)

3. Вы не должны хранить пароли в виде обычного текста, вы должны использовать password_hash() и password_verify() .

4. @Barmar есть hash() вызов, но вы правы насчет password_verify()

5. htmlspecialchars никогда не следует использовать для очистки ввода. Его следует использовать только при отображении предоставленных пользователем данных на веб-страницах, чтобы предотвратить XSS.