2

我这里有一些代码在我输入它时返回“用户名不正确”,当它应该输出“密码不正确”时,因为我只是输入了正确的用户名,但密码不正确。

if ($_POST['login']) {
    $username = strip_tags($_POST['username']);
    $password = strip_tags($_POST['password']);
    $fetchme = $dbc->query('SELECT * FROM users WHERE username="$username"');
    while($row = $fetchme->fetch(PDO::FETCH_ASSOC)) {
        $lastlogin = $row['lastlogin'];
    }
    if (!$username||!$password) {
        echo '<center>Please enter a valid username and password</center>';
    }else{
        $login = $dbc->query('SELECT * FROM users WHERE username="$username"');
        $num_rows_login = ($login->fetchColumn() > 0) ? true : false;
        if ($num_rows_login == 0) {
            echo "<center>Username doesn't exist</center>";
        }else{
            while($login_row = $login->fetch(PDO::FETCH_ASSOC)) {
                $password_db = $login_row['password'];
                $password_db2 = hash('sha512', $password);
                if ($password_db2 != $password_db) {
                    echo '<center>Incorrect password</center>';
                }
            }
        }    
    }
}

这是我第一次使用 PDO。任何帮助表示赞赏!

4

1 回答 1

0

首先,不要strip_tags()在用户名或密码上使用;它们没有任何用途,您应该在 SQL 中正确地转义它们(或使用准备好的语句)。

其次,您可以假设最多会从users表中返回一行,因此您真的不需要 awhile来获取所有记录。

第三,不要区分不存在的用户名和无效密码;他们都应该产生相同的消息“无效的用户名或密码”。

这是一个快速重写:

$stmt = $dbc->prepare('SELECT * FROM users WHERE username=?');
$stmt->execute(array($username));
// fetch all records and take first one (returns false in case of no rows)
$user = current($stmt->fetchAll(PDO::FETCH_ASSOC));
// validate record
if ($user === false || hash('sha512', $password) !== $user['password']) {
    echo '<center>Invalid username or password</center>';
} else {
    echo 'yay, you are the man';
}

最后,阅读此内容以获得更好的密码散列:

如何在 PHP 中使用 bcrypt 对密码进行哈希处理?

于 2013-01-23T03:24:55.973 回答