首先,我已尽力为此找到明确的答案。其次,我的代码似乎可以工作,但我想确认我正在以一种有效的方式执行此操作,并且不会让自己面临安全漏洞。
首先,我在将用户添加到管理表时使用 PHP password_hash;
$stmt = $dbh->prepare("INSERT INTO admin (username, password) VALUES (:username, :password)");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$password = password_hash('password', PASSWORD_DEFAULT);
其次,当用户尝试登录时,我只通过匹配用户名从管理表中检索用户,因为我看不到在查询期间检查哈希的方法(这是我不确定是否有更好的部分方式),并从 POST 输入中定义 $password 变量;
$stmt = $dbh->prepare("SELECT * FROM admin WHERE username = :username");
$stmt->bindParam(':username', $username);
$username = $_POST['username'];
// define $password for use in password verify
$password = $_POST['password'];
第三,如果查询有结果,我在用户输入上运行 password_verify 以检查匹配,然后根据真或假进行分支。
if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
if (password_verify($password, $row['password'])) {
session_start();
foreach ($row as $user) {
$_SESSION['user'] = $row['id'];
}
} else {
$errors = true;
}
header('location: leads.php');
}
else {
$errors = true;
}
我知道有许多不同的方法来散列/保护密码,但是使用本机 password_hash 函数是我决定采用的方式,我的问题是我做得对吗/有更好的方法吗?
提前致谢。