Почему мой хэш пароля возвращает false, когда я предоставляю правильный пароль? - PullRequest
0 голосов
/ 05 июля 2019

когда я хэшировал свой пароль, я использовал password_hash ($ password, PASSWORD_ARGON2I).

Теперь я хочу проверить свой пароль для входа по хеш-паролю, хранящемуся на моем сервере sql.Тем не менее, password_verify продолжает возвращать false, хотя я предоставил правильный пароль.Кто-нибудь может помочь?

Я пытался найти решение в google и stackoverflow, но безрезультатно

if(isset($_POST['login'])) {

    $username = strip_tags(trim($_POST["username"]));
    $password = $_POST["password"];

    $query = "SELECT * FROM USERNAME WHERE user_id= '".$username."' ";
    $params = array();
    $stmt = sqlsrv_query($conn, $query);

    $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

    $hash_password = $row['password'];

    $new = password_verify($password, $hash_password);


    if(var_dump(password_verify($password, $hash_password))){

        $msg = "Login Success"; 

    }else{

        $msg = "Login failure";

    }

    echo $msg;
}

В результате выдается «Ошибка входа»

Ответы [ 3 ]

1 голос
/ 05 июля 2019
  1. Неразбериха с вводом опасна, вы можете воздействовать на содержимое userid, используя strip_tags, и в любом случае его не нужно использовать, если вы используете подготовленные запросы.

  2. с использованием var_dump() в этой строке if(var_dump(password_verify($password, $hash_password))){ будет постоянно вызывать ложь, поскольку var_dump() возвращает NULL.

  3. Также неплохо добавить проверку некоторых ошибок к вызовам sqlsrv_.

Предлагаемые поправки к коду

if(isset($_POST['login'])) {

    //$username = strip_tags(trim($_POST["username"]));
    //$password = $_POST["password"];

    $query = "SELECT * FROM USERNAME WHERE user_id= ?";
    $params = array($_POST["username"]);
    $stmt = sqlsrv_prepare($conn, $query, $params);
    if( !$stmt ) {
        print_r( sqlsrv_errors(), true);
        exit;
    }

    if( sqlsrv_execute( $stmt ) === false ) {
        print_r( sqlsrv_errors(), true);
        exit;
    }

    $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

    //$hash_password = $row['password'];
    //$new = password_verify($password, $hash_password);
    //if(password_verify($password, $hash_password)){

    if(password_verify($_POST["username"], $row['password']))){
        $msg = "Login Success"; 
    }else{
        $msg = "Login failure";
    }
    echo $msg;
}

Конечно, еще одна вещь, которую нужно проверить, это то, что хеширование пароля работало правильно, если в случае неудачи вы никогда не получите проверку для работы.

0 голосов
/ 05 июля 2019

Обращаясь к проблеме внедрения SQL-кода RiggsFolly, я переделал свой код, как показано ниже.Надеюсь, что это правильный путь.

if(isset($_POST['login'])) {

    $username = $_POST["username"];
    $password = $_POST["password"];

    $query = "SELECT * FROM USERNAME WHERE user_id= ? ";
    $params = array($username);
    $stmt = sqlsrv_prepare($conn, $query, $params);

    if(sqlsrv_execute($stmt)){

        $row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);

        $hash_password = $row['password'];

        $new = password_verify($password, $hash_password);

        if(password_verify($password, $hash_password)){

            $msg = "Login Success"; 

        }else{

            $msg = "Login failure";

        }

    }

}
0 голосов
/ 05 июля 2019

var_dump () всегда возвращает «void».password_verify () возвращает "bool".Таким образом, вы должны проверить на password_verify () напрямую.

!ВНИМАНИЕ!

Ваш код открыт для SQL-инъекций!Я бы не рекомендовал использовать ваш код.Тем не менее, поскольку вы попросили одну конкретную вещь, это может сработать:

if(password_verify($password, $hash_password)){
    $msg = "Login Success"; 
} else {
    $msg = "Login failure";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...