まず、これについて決定的な答えを見つけるために最善を尽くしました。第二に、私のコードは機能しているように見えますが、これを効率的な方法で行っており、セキュリティ違反にさらされていないことを確認したいと思います.
まず、ユーザーを管理テーブルに追加するときに 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'];
3 番目に、クエリの結果がある場合は、ユーザー入力に対して password_verify を実行して一致を確認し、true または false に応じて分岐します。
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 関数を使用することにしました。
前もって感謝します。