Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mengesahkan Pengguna dengan Selamat dengan Kata Laluan Masin yang Disimpan dalam Pangkalan Data?

Bagaimana untuk Mengesahkan Pengguna dengan Selamat dengan Kata Laluan Masin yang Disimpan dalam Pangkalan Data?

Linda Hamilton
Lepaskan: 2024-12-05 03:39:09
asal
890 orang telah melayarinya

How to Safely Authenticate Users with Salted Passwords Stored in a Database?

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'];
Salin selepas log masuk

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);
}
Salin selepas log masuk

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);
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan