PHP密码验证方法始终为false

时间:2017-01-17 14:45:06

标签: php hash passwords

这是我的login.php页面

 <?php echo $loginError; ?>

        <form class="form-inline" action="<?php echo htmlspecialchars( $_SERVER['PHP_SELF'] ); ?>" method="post">

            <div class="form-group">
                <label for="login-username" class="sr-only">Username</label>
                <input type="text" class="form-control" id="login-username" placeholder="username" name="username">
            </div>
            <div class="form-group">
                <label for="login-password" class="sr-only">Password</label>
                <input type="password" class="form-control" id="login-password" placeholder="password" name="password">
            </div>
            <button type="submit" class="btn btn-default" name="login">Login!</button>

        </form>

这是我验证密码的地方

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

// build a function to validate data
function validateFormData( $formData ) {
    $formData = trim( stripslashes( htmlspecialchars( $formData ) ) );
    return $formData;
}

// create variables
// wrap the data with our function
$formUser = validateFormData( $_POST['username'] );
$formPass = validateFormData( $_POST['password'] );

// connect to database
include('connection.php');

// create SQL query
$query = "SELECT username, email, password FROM users WHERE username='$formUser'";

// store the result
$result = mysqli_query( $conn, $query );

// verify if result is returned
if( mysqli_num_rows($result) > 0 ) {

    // store basic user data in variables
    while( $row = mysqli_fetch_assoc($result) ) {
        $user       = $row['username'];
        $email      = $row['email'];
        $hashedPass = $row['password'];
    }

    // verify hashed password with the typed password
    if( password_verify( $formPass, $hashedPass ) ) {

        // correct login details!
        // start the session
        session_start();

        // store data in SESSION variables
        $_SESSION['loggedInUser'] = $user;
        $_SESSION['loggedInEmail'] = $email;

        header("Location: profile.php");

    } else { // hashed password didn't verify

        // error message
        $loginError = "<div class='alert alert-danger'>Wrong username / password combination. Try again.</div>";

    }

} else { // there are no results in database

    $loginError = "<div class='alert alert-danger'>No such user in database. Please try again. <a class='close' data-dismiss='alert'>&times;</a></div>";

}

// close the mysql connection
mysqli_close($conn);

}

&GT;

但问题是它总是返回&#34;错误的密码/用户名组合&#34; 。似乎问题出在password_verify()方法中。 我将密码设置为255 VARCHAR,我的php版本也是7.0.2

2 个答案:

答案 0 :(得分:0)

我要解决的第一个问题是转义,密码输入不应该被转义,使用原始输入调用password_hash()函数是安全的。所以请勿拨打validateFormData(),只需使用password_hash($_POST['password'])。当然password_verify()也是如此。验证输入是一件好事,但不能逃避,这应该尽可能晚地针对特定目标系统进行。

代码中的另一个问题可能是重复的用户名。如果你没有明确地检查现有的用户名,你可能会有重复项,然后你可以获得密码哈希。我会考虑使用电子邮件作为ID。

最后,您的代码容易受到SQL注入的影响,请考虑使用预准备语句。您可以在此answer中找到一个示例。

答案 1 :(得分:0)

$formPass = validateFormData( $_POST['password'] );

// connect to database
include('connection.php');

在您输入密码后输入include语句。因此,$password变量必须用您的数据库密码覆盖。