остальное условие ничего не делать - PullRequest
0 голосов
/ 19 марта 2019

Попытка проверить хешированный пароль, который отлично работает, если введенный пароль верный, но если это не так, то ничего не происходит.
, что означает, что все, что написано после 'else', не работает.
код это что-то вроде этого:

if (password_verify($password, $hash)) {
        while ($row = $x->fetch_assoc()) {
            $_SESSION['logged_in'] = true;
            $_SESSION['username'] = $username;
            ?>
            <div class="right">You are logged in!</div>
            <script>
                setTimeout(function () {
                    window.location.href = "admin/adminpanel.php";
                }, 2000);
            </script>
            <?php
        }
    } else {
        echo "Wrong"; //Here I tried both echoing something or using html but none of them worked
        ?>
        <div class="wrong">Username or password is invalid</div>
        <?php
    }

ОБНОВЛЕНИЕ

Это полный код, если он необходим:
PHP:

 if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = mysqli_real_escape_string($conn, $_POST['username']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);
    $q = "SELECT * FROM users WHERE username='$username'";
    $x = $conn->query($q);
    $hash = password_hash($_POST['password'], PASSWORD_BCRYPT);
    if (password_verify($password, $hash)) {
        while ($row = $x->fetch_assoc()) {
            $_SESSION['logged_in'] = true;
            $_SESSION['username'] = $username;
            ?>
            <div class="right">You are logged in!</div>
            <script>
                setTimeout(function () {
                    window.location.href = "admin/adminpanel.php";
                }, 2000);
            </script>
            <?php
        }
    }  {
        ?>
        <div class="wrong">Username or Password is invalid</div>
        <?php
    }

}

HTML:

<form method="post" autocomplete="off">
            <input name="username" id="username" placeholder="Username" maxlength="20">
            <input name="password" id="password" type="password" placeholder="Password" maxlength="20">
            <input class="loginbutton" type="submit" value="Login">
        </form>

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Если я упросту то, что у вас есть, и уберу вызов mysqli_escape - по сути, это то, что вы оставили:

<?php
if (
    password_verify(
        $_POST['password'],
        password_hash($_POST['password'], PASSWORD_BCRYPT)
    )
) {
    echo 'Verified';
} else {
    echo 'Not verified.';
}

Теперь вышеупомянутое условие должно всегда выполняться (внимательно) и отображать «Проверено».

Логика ошибочна в приведенном выше коде.

Исправление: вы хотите получить хэш ранее сохраненного пароля из базы данных, а затем проверить это (НЕ хэш пароля, который вы только что отправили / опубликовали).

Над демонстрацией логически ошибочного подхода: https://3v4l.org/C88H2

0 голосов
/ 19 марта 2019

Прямо сейчас ваш код отлично отслеживает успешный сценарий. Это означает, что у вас password_verify($password, $hash) === true и while ($row = $x->fetch_assoc()) { равны истине один раз.

Но для сценария, когда второе условие не выполнено $x->fetch_assoc() === false, вы ничего не делаете. И php идет после вашего if ... else ... заявления.

Чтобы избежать этого, предлагаю удалить строку else. Это изменит поток кода, идущий сразу после if { ... }, когда while никогда не происходило.

}
// else {
    echo "Wrong"; //Here I tried both echoing something or using html but none of them worked
    ?>
    <div class="wrong">Username or password is invalid</div>
    <?php
//}

Или, возможно, вы можете удалить петлю while. Я не вижу, что вы используете $row в любом месте.

 //while ($row = $x->fetch_assoc()) {
        $_SESSION['logged_in'] = true;
        $_SESSION['username'] = $username;
        ?>
        <div class="right">You are logged in!</div>
        <script>
            setTimeout(function () {
                window.location.href = "admin/adminpanel.php";
            }, 2000);
        </script>
        <?php
    //}

ОБНОВЛЕНИЕ Ваш код должен выглядеть больше как (Я предполагаю, что: - вы используете mysqli - имя пользователя уникально в этой таблице - в столбце password хранятся хэши паролей пользователей. )

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $username = $_POST['username'];
    $password = $_POST['password'];
    $stmt = $conn->prepare("SELECT `username`, `password` FROM users WHERE username= ?";
    $stmt->bind_param('s', $username);
    $stmt->bind_result($name, $hash);
    if ($stmt->fetch()) {
       if (password_verify($password, $hash)) {
            $_SESSION['logged_in'] = true;
            $_SESSION['username'] = $username;
            ?>
            <div class="right">You are logged in!</div>
            <script>
                setTimeout(function () {
                    window.location.href = "admin/adminpanel.php";
                }, 2000);
            </script>
            <?php
        }
    }  

    ?>
    <div class="wrong">Username or Password is invalid</div>
    <?php    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...