2

I have a bit of code here that returns "Username is not correct" when I input it, when it's supposed to output "Incorrect password," because I'm simply putting in a correct username, but an incorrect password.

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

This is my first time using PDO. Any help is appreciated!

4

1 に答える 1

0

まず第一に、strip_tags()ユーザー名やパスワードには使用しないでください。それらは何の目的も果たさないので、SQLで適切にエスケープする(またはプリペアドステートメントを使用する)必要があります。

次に、テーブルから最大で1つの行が返されると想定できるため、すべてのレコードをフェッチusersする必要はありません。while

第三に、存在しないユーザー名と無効なパスワードを区別しないでください。どちらも「無効なユーザー名またはパスワード」という同じメッセージを生成する必要があります。

簡単な書き直しは次のとおりです。

$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 に答える