当我提供正确的密码时,为什么我的密码哈希返回false?

时间:2019-07-05 08:54:51

标签: php sql hash passwords

当我对密码进行哈希处理时,我使用了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 个答案:

答案 0 :(得分:1)

  1. 缺少输入很危险,如果您使用准备好的查询,则可能会使用strip_tags来影响userid的内容,而不必要地使用它。

  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;
}
  

当然,要检查的另一件事是密码的散列正确工作,如果失败,您将永远无法进行验证。

答案 1 :(得分:0)

var_dump()始终返回“ void”。 password_verify()返回“布尔”。因此,您必须直接检查password_verify()。

!警告!

您的代码对SQL注入开放!我不建议使用您的代码。 但是,由于您特别要求一件事,所以这可能有效:

if(password_verify($password, $hash_password)){
    $msg = "Login Success"; 
} else {
    $msg = "Login failure";
}

答案 2 :(得分:0)

在解决RiggsFolly SQL注入问题时,我重做了我的代码,如下所示。希望这是正确的方法。

WebTestClient.bindToApplicationContext(context).configureClient()
                                 .filter(documentationConfiguration(this.restDocumentation))
                                      // alwaysDo?
                                           .build();