我在这里输入一些代码,当我输入“用户名不正确”时,它应该输出“密码不正确”,因为我只是输入正确的用户名,但密码不正确。< / p>
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。任何帮助表示赞赏!
答案 0 :(得分:0)
首先,不要在用户名或密码上使用strip_tags()
;它们不用于任何目的,你应该只是在SQL中正确地转义它们(或者使用准备好的语句)。
其次,您可以假设最多会从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';
}
最后,请阅读此内容以获得更好的密码哈希: