Cara Menarik Balik Kata Laluan Masin daripada Pangkalan Data dan Mengesahkan Pengguna
Apabila melaksanakan tapak keahlian dengan kata laluan masin yang disimpan dalam pangkalan data, memastikan pengesahan yang betul menjadi penting. Walau bagaimanapun, ralat boleh timbul apabila cuba menyemak kewujudan pengguna.
Isunya
Coretan kod di bawah menunjukkan kaedah yang salah untuk mengesahkan sama ada ahli wujud:
$name = mysqli_real_escape_string($connect, $_POST['name']); $password = mysqli_real_escape_string($connect, $_POST['password']); $saltQuery = "SELECT salt FROM users WHERE name = '$name';"; $result = mysqli_query($connect, $saltQuery); if ($result === false){ die(mysqli_error()); } $row = mysqli_fetch_assoc($result); $salt = $row['salt'];
Kod ini cuba untuk mendapatkan semula garam daripada pangkalan data tetapi gagal jika pertanyaan kembali palsu.
Penyelesaian
Untuk mengesahkan kelayakan log masuk pengguna dengan tepat, kami perlu mendapatkan semula cincang kata laluan yang disimpan dan membandingkannya dengan kata laluan yang dimasukkan pengguna. Proses ini melibatkan penggunaan fungsi password_hash() dan password_verify().
Kod Contoh untuk MySQLi
/** * mysqli example for a login with a stored password-hash */ $mysqli = new mysqli($dbHost, $dbUser, $dbPassword, $dbName); $mysqli->set_charset('utf8'); // Find the stored password hash in the database, searching by username $sql = 'SELECT password FROM users WHERE name = ?'; $stmt = $mysqli->prepare($sql); $stmt->bind_param('s', $_POST['name']); // it is safe to pass the user input unescaped $stmt->execute(); // If this user exists, fetch the password-hash and check it $isPasswordCorrect = false; $stmt->bind_result($hashFromDb); if ($stmt->fetch() === true) { // Check whether the entered password matches the stored hash. // The salt and the cost factor will be extracted from $hashFromDb. $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb); }
Contoh Kod untuk PDO
/** * pdo example for a login with a stored password-hash */ $dsn = "mysql:host=$dbHost;dbname=$dbName;charset=utf8"; $pdo = new PDO($dsn, $dbUser, $dbPassword); // Find the stored password hash in the database, searching by username $sql = 'SELECT password FROM users WHERE name = ?'; $stmt = $pdo->prepare($sql); $stmt->bindValue(1, $_POST['name'], PDO::PARAM_STR); // it is safe to pass the user input unescaped $stmt->execute(); // If this user exists, fetch the password hash and check it $isPasswordCorrect = false; if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) { $hashFromDb = $row['password']; // Check whether the entered password matches the stored hash. // The salt and the cost factor will be extracted from $hashFromDb. $isPasswordCorrect = password_verify($_POST['password'], $hashFromDb); }
Atas ialah kandungan terperinci Bagaimana untuk Mengesahkan Pengguna dengan Selamat dengan Kata Laluan Masin yang Disimpan dalam Pangkalan Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!