我使用Anthony Ferrara的密码兼容性库,使用河豚搜索我的密码。当我散列它们时它们很好,但是当我尝试验证密码时,执行此操作:
public function Login($username, $postpassword) {
$stmt = $this->mysqli->prepare("SELECT username, password FROM users WHERE username=? AND password=?");
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
$stmt->bind_result($username, $password);
$stmt->store_result();
if($stmt->num_rows == 1) {
while($stmt->fetch()) {
if (password_verify($postpassword, $password)) {
$SESSID = $this->newSession($username);
$_SESSION['admin_user'] = $username;
$_SESSION['last_login'] = time();
header("Location: home.php?SESSID=$SESSID");
exit();
}
}
}
else {
header("Location: index.php?e=false");
exit();
}
$stmt->close();
$stmt->free_result();
}
它告诉我,我的细节是错误的......是的,我确实定义了$username
和$password
:
if(isset($_REQUEST['login'])) {
$username = $_POST['username'];
$postpassword = $_POST['password'];
$users->Login($username, $postpassword);
}
有人看到我犯的错误吗?
答案 0 :(得分:5)
您正在从数据库中选择用户名与输入的用户名相匹配的用户,密码 哈希 与输入的明文密码相匹配。当然,这永远不会匹配任何东西。您必须仅根据用户名从数据库中选择用户名和密码,然后使用password_verify
验证密码。